diff --git a/docs/bitwarden_system.dsl b/docs/bitwarden_system.dsl index 6728864dfb..edb49caeb3 100644 --- a/docs/bitwarden_system.dsl +++ b/docs/bitwarden_system.dsl @@ -15,6 +15,7 @@ workspace "Bitwarden Server System" { !include "admin_console/models.dsl" !include "auth/models.dsl" !include "billing/models.dsl" + !include "dirt/models.dsl" !include "key_management/models.dsl" !include "platform/models.dsl" !include "tools/models.dsl" @@ -23,10 +24,10 @@ workspace "Bitwarden Server System" { # Include shared level relationships !include "shared.relationships.dsl" - !include "admin_console/relationships.dsl" !include "auth/relationships.dsl" !include "billing/relationships.dsl" + !include "dirt/relationships.dsl" !include "key_management/relationships.dsl" !include "platform/relationships.dsl" !include "tools/relationships.dsl" @@ -37,6 +38,7 @@ workspace "Bitwarden Server System" { !include "admin_console/views.dsl" !include "auth/views.dsl" !include "billing/views.dsl" + !include "dirt/views.dsl" !include "key_management/views.dsl" !include "platform/views.dsl" !include "tools/views.dsl" @@ -50,6 +52,9 @@ workspace "Bitwarden Server System" { include * } + filtered Bitwarden_Server exclude "Self-Hosted-Only" "Cloud" + filtered Bitwarden_Server exclude "Cloud-Only" "Self-Hosted" + // This is last to override team styles with common styles !include "shared.views.dsl" } diff --git a/docs/bitwarden_system.json b/docs/bitwarden_system.json index 07b33fa593..a5f824651e 100644 --- a/docs/bitwarden_system.json +++ b/docs/bitwarden_system.json @@ -23,7 +23,8 @@ } ] }, "id" : 1, - "lastModifiedDate" : "2025-07-01T14:14:59Z", + "lastModifiedAgent" : "structurizr-ui", + "lastModifiedDate" : "2025-12-29T19:00:21Z", "model" : { "people" : [ { "description" : "An end user of the Bitwarden System", @@ -35,44 +36,44 @@ }, "relationships" : [ { "description" : "Uses", - "destinationId" : "16", - "id" : "52", + "destinationId" : "15", + "id" : "116", "sourceId" : "1", "tags" : "Relationship" }, { "description" : "Uses", - "destinationId" : "15", - "id" : "53", - "linkedRelationshipId" : "52", + "destinationId" : "14", + "id" : "117", + "linkedRelationshipId" : "116", "sourceId" : "1" + }, { + "description" : "Uses", + "destinationId" : "16", + "id" : "118", + "sourceId" : "1", + "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "17", - "id" : "54", + "id" : "119", "sourceId" : "1", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "18", - "id" : "55", + "id" : "120", "sourceId" : "1", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "19", - "id" : "56", + "id" : "121", "sourceId" : "1", "tags" : "Relationship" }, { "description" : "Uses", "destinationId" : "20", - "id" : "57", - "sourceId" : "1", - "tags" : "Relationship" - }, { - "description" : "Uses", - "destinationId" : "21", - "id" : "58", + "id" : "122", "sourceId" : "1", "tags" : "Relationship" } ], @@ -88,14 +89,14 @@ "relationships" : [ { "description" : "Administers System", "destinationId" : "9", - "id" : "67", + "id" : "131", "sourceId" : "2", "tags" : "Relationship" }, { "description" : "Administers System", "destinationId" : "4", - "id" : "68", - "linkedRelationshipId" : "67", + "id" : "132", + "linkedRelationshipId" : "131", "sourceId" : "2" } ], "tags" : "Element,Person,Bitwarden Employee,Self-Host Admin" @@ -111,20 +112,20 @@ "relationships" : [ { "description" : "Inspects and supports", "destinationId" : "9", - "id" : "65", + "id" : "129", "sourceId" : "3", "tags" : "Relationship" }, { "description" : "Inspects and supports", "destinationId" : "4", - "id" : "66", - "linkedRelationshipId" : "65", + "id" : "130", + "linkedRelationshipId" : "129", "sourceId" : "3" } ], "tags" : "Element,Person,Bitwarden Employee" }, { "description" : "An administrator of an organization", - "id" : "25", + "id" : "24", "location" : "Unspecified", "name" : "Organization Admin", "properties" : { @@ -132,21 +133,21 @@ }, "relationships" : [ { "description" : "Administers Organizations", - "destinationId" : "16", - "id" : "59", - "sourceId" : "25", + "destinationId" : "15", + "id" : "123", + "sourceId" : "24", "tags" : "Relationship" }, { "description" : "Administers Organizations", - "destinationId" : "15", - "id" : "60", - "linkedRelationshipId" : "59", - "sourceId" : "25" + "destinationId" : "14", + "id" : "124", + "linkedRelationshipId" : "123", + "sourceId" : "24" } ], "tags" : "Element,Person,Admin" }, { "description" : "And employee of a managed service provider", - "id" : "26", + "id" : "25", "location" : "Unspecified", "name" : "MSP", "properties" : { @@ -155,27 +156,27 @@ "relationships" : [ { "description" : "Completes Provider registration with", "destinationId" : "9", - "id" : "61", - "sourceId" : "26", + "id" : "125", + "sourceId" : "25", "tags" : "Relationship" }, { "description" : "Completes Provider registration with", "destinationId" : "4", - "id" : "62", - "linkedRelationshipId" : "61", - "sourceId" : "26" - }, { - "description" : "Administers Providers and Organizations", - "destinationId" : "16", - "id" : "63", - "sourceId" : "26", - "tags" : "Relationship" + "id" : "126", + "linkedRelationshipId" : "125", + "sourceId" : "25" }, { "description" : "Administers Providers and Organizations", "destinationId" : "15", - "id" : "64", - "linkedRelationshipId" : "63", - "sourceId" : "26" + "id" : "127", + "sourceId" : "25", + "tags" : "Relationship" + }, { + "description" : "Administers Providers and Organizations", + "destinationId" : "14", + "id" : "128", + "linkedRelationshipId" : "127", + "sourceId" : "25" } ], "tags" : "Element,Person,MSP" } ], @@ -193,14 +194,14 @@ }, "relationships" : [ { "description" : "Requests payments for customers", - "destinationId" : "32", - "id" : "105", + "destinationId" : "31", + "id" : "166", "sourceId" : "6", "tags" : "Relationship" }, { "description" : "Requests payments for customers", - "destinationId" : "33", - "id" : "108", + "destinationId" : "32", + "id" : "169", "sourceId" : "6", "tags" : "Relationship" } ], @@ -214,50 +215,536 @@ }, "relationships" : [ { "description" : "Validates JWTs with", - "destinationId" : "30", - "id" : "89", + "destinationId" : "29", + "id" : "153", "sourceId" : "5", "tags" : "Relationship", "url" : "https://bitwarden.com" }, { "description" : "Queries", "destinationId" : "11", - "id" : "91", - "sourceId" : "5", - "tags" : "Relationship" - }, { - "description" : "Sends events to", - "destinationId" : "12", - "id" : "93", + "id" : "155", "sourceId" : "5", "tags" : "Relationship" }, { "description" : "Sends emails to", - "destinationId" : "13", - "id" : "95", + "destinationId" : "12", + "id" : "157", "sourceId" : "5", "tags" : "Relationship" }, { "description" : "Sends notifications to", - "destinationId" : "14", - "id" : "96", + "destinationId" : "13", + "id" : "158", "sourceId" : "5", "tags" : "Relationship" }, { "description" : "Requests payments for customers", - "destinationId" : "32", - "id" : "106", - "linkedRelationshipId" : "105", + "destinationId" : "31", + "id" : "167", + "linkedRelationshipId" : "166", "sourceId" : "5" }, { "description" : "Requests payments for customers", + "destinationId" : "32", + "id" : "170", + "linkedRelationshipId" : "169", + "sourceId" : "5" + }, { + "description" : "Sends events to", + "destinationId" : "34", + "id" : "175", + "sourceId" : "5", + "tags" : "Relationship" + }, { + "description" : "Sends events to", "destinationId" : "33", - "id" : "109", - "linkedRelationshipId" : "108", + "id" : "176", + "linkedRelationshipId" : "175", + "sourceId" : "5" + }, { + "description" : "Sends events to", + "destinationId" : "48", + "id" : "185", + "sourceId" : "5", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "47", + "id" : "186", + "linkedRelationshipId" : "185", "sourceId" : "5" } ], "tags" : "Element,Container,API" }, { + "components" : [ { + "description" : "Listens to a specific queue and passes off to a handler to handle events", + "documentation" : { }, + "id" : "79", + "name" : "RabbitMqEventListenerService", + "properties" : { + "structurizr.dsl.identifier" : "server.events.event_listener" + }, + "relationships" : [ { + "description" : "Listens to", + "destinationId" : "50", + "id" : "262", + "properties" : { + "structurizr.dsl.identifier" : "eventswritelistener_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "47", + "id" : "263", + "linkedRelationshipId" : "262", + "sourceId" : "79" + }, { + "description" : "Listens to", + "destinationId" : "54", + "id" : "265", + "properties" : { + "structurizr.dsl.identifier" : "eventsdatadoglistener_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "53", + "id" : "267", + "properties" : { + "structurizr.dsl.identifier" : "eventsheclistener_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "51", + "id" : "269", + "properties" : { + "structurizr.dsl.identifier" : "eventsslacklistener_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "55", + "id" : "271", + "properties" : { + "structurizr.dsl.identifier" : "eventsteamslistener_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "52", + "id" : "273", + "properties" : { + "structurizr.dsl.identifier" : "eventswebhooklistener_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "81", + "id" : "275", + "properties" : { + "structurizr.dsl.identifier" : "eventswritedelegate_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "82", + "id" : "278", + "properties" : { + "structurizr.dsl.identifier" : "eventsintegrationhandlerdelegate_events" + }, + "sourceId" : "79", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Listens to a specific queue and passes off to a handler to handle IntegrationMessages", + "documentation" : { }, + "id" : "80", + "name" : "RabbitMqIntegrationListenerService", + "properties" : { + "structurizr.dsl.identifier" : "server.events.integration_listener" + }, + "relationships" : [ { + "description" : "Listens to", + "destinationId" : "56", + "id" : "286", + "properties" : { + "structurizr.dsl.identifier" : "integrationslacklistener_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "47", + "id" : "287", + "linkedRelationshipId" : "286", + "sourceId" : "80" + }, { + "description" : "Listens to", + "destinationId" : "57", + "id" : "289", + "properties" : { + "structurizr.dsl.identifier" : "integrationwebhooklistener_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "58", + "id" : "291", + "properties" : { + "structurizr.dsl.identifier" : "integrationheclistener_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "59", + "id" : "293", + "properties" : { + "structurizr.dsl.identifier" : "integrationdatadoglistener_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "60", + "id" : "295", + "properties" : { + "structurizr.dsl.identifier" : "integrationteamslistener_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "83", + "id" : "297", + "properties" : { + "structurizr.dsl.identifier" : "integrationslackdelegate_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "84", + "id" : "298", + "properties" : { + "structurizr.dsl.identifier" : "integrationteamsdelegate_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "85", + "id" : "299", + "properties" : { + "structurizr.dsl.identifier" : "integrationdatadogdelegate_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "86", + "id" : "300", + "properties" : { + "structurizr.dsl.identifier" : "integrationwebhookdelegate_events" + }, + "sourceId" : "80", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Handles all events, passing them off to the IEventWriteService with the `persistent` key for long term storage.", + "documentation" : { }, + "id" : "81", + "name" : "EventRepositoryHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events.event_repository_handler" + }, + "relationships" : [ { + "description" : "Writes events to", + "destinationId" : "11", + "id" : "276", + "properties" : { + "structurizr.dsl.identifier" : "eventrepositorydatabase_events" + }, + "sourceId" : "81", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Fetches the relevant configurations when an event comes in and hands the event to its paired integration handler for processing.", + "documentation" : { }, + "id" : "82", + "name" : "EventIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events.event_integration_handler" + }, + "relationships" : [ { + "description" : "Fetches template details from", + "destinationId" : "11", + "id" : "279", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlerdatabase_events" + }, + "sourceId" : "82", + "tags" : "Relationship" + }, { + "description" : "Fetches configurations from", + "destinationId" : "87", + "id" : "281", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlercache_events" + }, + "sourceId" : "82", + "tags" : "Relationship" + }, { + "description" : "Runs filters", + "destinationId" : "91", + "id" : "282", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlerfilter_events" + }, + "sourceId" : "82", + "tags" : "Relationship" + }, { + "description" : "Publishes To", + "destinationId" : "49", + "id" : "283", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlerpublish_events" + }, + "sourceId" : "82", + "tags" : "Relationship" + }, { + "description" : "Publishes To", + "destinationId" : "47", + "id" : "284", + "linkedRelationshipId" : "283", + "sourceId" : "82" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Processes Slack IntegrationMessages, posting them to the configured channels.", + "documentation" : { }, + "id" : "83", + "name" : "SlackIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events.slack_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "88", + "id" : "325", + "properties" : { + "structurizr.dsl.identifier" : "slacktoslackservice_events" + }, + "sourceId" : "83", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Processes Teams IntegrationMessages, posting them to the configured channels.", + "documentation" : { }, + "id" : "84", + "name" : "TeamsIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events.teams_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "89", + "id" : "330", + "properties" : { + "structurizr.dsl.identifier" : "teamstoteamsservice_events" + }, + "sourceId" : "84", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Processes Datadog IntegrationMessages, posting them to the configured URI.", + "documentation" : { }, + "id" : "85", + "name" : "DatadogIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events.datadog_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "90", + "id" : "335", + "properties" : { + "structurizr.dsl.identifier" : "datadoghandlerhttpclient_events" + }, + "sourceId" : "85", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Processes Webhook and HEC IntegrationMessages, posting them to the configured URI.", + "documentation" : { }, + "id" : "86", + "name" : "WebhookIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events.webhook_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "90", + "id" : "334", + "properties" : { + "structurizr.dsl.identifier" : "webhookhandlerhttpclient_events" + }, + "sourceId" : "86", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Caches all configurations for integrations in memory so that events can be handled without adding database load.", + "documentation" : { }, + "id" : "87", + "name" : "EventIntegrationsExtendedCache", + "properties" : { + "structurizr.dsl.identifier" : "server.events.event_integrations_extended_cache" + }, + "relationships" : [ { + "description" : "Fetches configurations from", + "destinationId" : "11", + "id" : "280", + "properties" : { + "structurizr.dsl.identifier" : "cachedatabasefetch_events" + }, + "sourceId" : "87", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Handles all API interaction with Slack.", + "documentation" : { }, + "id" : "88", + "name" : "SlackService", + "properties" : { + "structurizr.dsl.identifier" : "server.events.slack_service" + }, + "relationships" : [ { + "description" : "Publishes configured events to", + "destinationId" : "93", + "id" : "326", + "properties" : { + "structurizr.dsl.identifier" : "slackservicetoslack_events" + }, + "sourceId" : "88", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "327", + "linkedRelationshipId" : "326", + "sourceId" : "88", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Handles all API interaction with Teams.", + "documentation" : { }, + "id" : "89", + "name" : "TeamsService", + "properties" : { + "structurizr.dsl.identifier" : "server.events.teams_service" + }, + "relationships" : [ { + "description" : "Publishes configured events to", + "destinationId" : "94", + "id" : "331", + "properties" : { + "structurizr.dsl.identifier" : "teamsservicetoteams_events" + }, + "sourceId" : "89", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "332", + "linkedRelationshipId" : "331", + "sourceId" : "89", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Performs any Http functions for Datadog / Webhooks / HEC.", + "documentation" : { }, + "id" : "90", + "name" : "HttpClient", + "properties" : { + "structurizr.dsl.identifier" : "server.events.http_client" + }, + "relationships" : [ { + "description" : "Publishes configured events to", + "destinationId" : "97", + "id" : "336", + "properties" : { + "structurizr.dsl.identifier" : "httptocrowdstrike_events" + }, + "sourceId" : "90", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "337", + "linkedRelationshipId" : "336", + "sourceId" : "90", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "96", + "id" : "339", + "properties" : { + "structurizr.dsl.identifier" : "httptodatadog_events" + }, + "sourceId" : "90", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "95", + "id" : "341", + "properties" : { + "structurizr.dsl.identifier" : "httptosplunk_events" + }, + "sourceId" : "90", + "tags" : "Relationship,Self-Hosted-Only", + "technology" : "tags" + } ], + "tags" : "Element,Component,Self-Hosted-Only" + }, { + "description" : "Processes filters from configurations to determine if an event should be processed out to the integration.", + "documentation" : { }, + "id" : "91", + "name" : "IntegrationFilterService", + "properties" : { + "structurizr.dsl.identifier" : "server.events.integration_filter_service" + }, + "tags" : "Element,Component,Self-Hosted-Only" + } ], "documentation" : { }, "id" : "7", "name" : "Events", @@ -266,10 +753,149 @@ }, "relationships" : [ { "description" : "Sends events to", - "destinationId" : "12", - "id" : "94", + "destinationId" : "34", + "id" : "177", "sourceId" : "7", "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "33", + "id" : "178", + "linkedRelationshipId" : "177", + "sourceId" : "7" + }, { + "description" : "Sends events to", + "destinationId" : "48", + "id" : "187", + "sourceId" : "7", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "47", + "id" : "188", + "linkedRelationshipId" : "187", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "50", + "id" : "264", + "linkedRelationshipId" : "262", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "54", + "id" : "266", + "linkedRelationshipId" : "265", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "53", + "id" : "268", + "linkedRelationshipId" : "267", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "51", + "id" : "270", + "linkedRelationshipId" : "269", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "55", + "id" : "272", + "linkedRelationshipId" : "271", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "52", + "id" : "274", + "linkedRelationshipId" : "273", + "sourceId" : "7" + }, { + "description" : "Writes events to", + "destinationId" : "11", + "id" : "277", + "linkedRelationshipId" : "276", + "sourceId" : "7", + "technology" : "tags" + }, { + "description" : "Publishes To", + "destinationId" : "49", + "id" : "285", + "linkedRelationshipId" : "283", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "56", + "id" : "288", + "linkedRelationshipId" : "286", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "57", + "id" : "290", + "linkedRelationshipId" : "289", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "58", + "id" : "292", + "linkedRelationshipId" : "291", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "59", + "id" : "294", + "linkedRelationshipId" : "293", + "sourceId" : "7" + }, { + "description" : "Listens to", + "destinationId" : "60", + "id" : "296", + "linkedRelationshipId" : "295", + "sourceId" : "7" + }, { + "description" : "Publishes configured events to", + "destinationId" : "93", + "id" : "328", + "linkedRelationshipId" : "326", + "sourceId" : "7", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "329", + "linkedRelationshipId" : "326", + "sourceId" : "7", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "94", + "id" : "333", + "linkedRelationshipId" : "331", + "sourceId" : "7", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "97", + "id" : "338", + "linkedRelationshipId" : "336", + "sourceId" : "7", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "96", + "id" : "340", + "linkedRelationshipId" : "339", + "sourceId" : "7", + "technology" : "tags" + }, { + "description" : "Publishes configured events to", + "destinationId" : "95", + "id" : "342", + "linkedRelationshipId" : "341", + "sourceId" : "7", + "technology" : "tags" } ], "tags" : "Element,Container,Events" }, { @@ -281,8 +907,8 @@ }, "relationships" : [ { "description" : "Sends notifications to", - "destinationId" : "14", - "id" : "97", + "destinationId" : "13", + "id" : "159", "sourceId" : "8", "tags" : "Relationship" } ], @@ -297,19 +923,594 @@ "relationships" : [ { "description" : "Queries", "destinationId" : "11", - "id" : "92", + "id" : "156", "sourceId" : "9", "tags" : "Relationship" } ], "tags" : "Element,Container,Web" }, { + "components" : [ { + "description" : "Handles all events, passing them off to the IEventWriteService with the `persistent` key for long term storage.", + "documentation" : { }, + "id" : "66", + "name" : "EventRepositoryHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.event_repository_handler" + }, + "relationships" : [ { + "description" : "Writes events to", + "destinationId" : "11", + "id" : "230", + "properties" : { + "structurizr.dsl.identifier" : "eventrepositorydatabase" + }, + "sourceId" : "66", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Listens to a specific subscription and passes off to a handler to handle events", + "documentation" : { }, + "id" : "67", + "name" : "AzureServiceBusEventListenerService", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.event_listener" + }, + "relationships" : [ { + "description" : "Listens to", + "destinationId" : "36", + "id" : "206", + "properties" : { + "structurizr.dsl.identifier" : "eventswritelistener" + }, + "sourceId" : "67", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "33", + "id" : "207", + "linkedRelationshipId" : "206", + "sourceId" : "67" + }, { + "description" : "Delegates to", + "destinationId" : "66", + "id" : "210", + "properties" : { + "structurizr.dsl.identifier" : "eventswritedelegate" + }, + "sourceId" : "67", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "40", + "id" : "211", + "properties" : { + "structurizr.dsl.identifier" : "eventsdatadoglistener" + }, + "sourceId" : "67", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "39", + "id" : "213", + "properties" : { + "structurizr.dsl.identifier" : "eventsheclistener" + }, + "sourceId" : "67", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "37", + "id" : "215", + "properties" : { + "structurizr.dsl.identifier" : "eventsslacklistener" + }, + "sourceId" : "67", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "41", + "id" : "217", + "properties" : { + "structurizr.dsl.identifier" : "eventsteamslistener" + }, + "sourceId" : "67", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "38", + "id" : "219", + "properties" : { + "structurizr.dsl.identifier" : "eventswebhooklistener" + }, + "sourceId" : "67", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "69", + "id" : "221", + "properties" : { + "structurizr.dsl.identifier" : "eventsintegrationhandlerdelegate" + }, + "sourceId" : "67", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Listens to a specific subscription and passes off to a handler to handle IntegrationMessages", + "documentation" : { }, + "id" : "68", + "name" : "AzureServiceBusIntegrationListenerService", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.integration_listener" + }, + "relationships" : [ { + "description" : "Listens to", + "destinationId" : "42", + "id" : "231", + "properties" : { + "structurizr.dsl.identifier" : "integrationslacklistener" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "33", + "id" : "232", + "linkedRelationshipId" : "231", + "sourceId" : "68" + }, { + "description" : "Delegates to", + "destinationId" : "70", + "id" : "234", + "properties" : { + "structurizr.dsl.identifier" : "integrationslackdelegate" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "43", + "id" : "235", + "properties" : { + "structurizr.dsl.identifier" : "integrationwebhooklistener" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "73", + "id" : "237", + "properties" : { + "structurizr.dsl.identifier" : "integrationwebhookdelegate" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "44", + "id" : "238", + "properties" : { + "structurizr.dsl.identifier" : "integrationheclistener" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "45", + "id" : "240", + "properties" : { + "structurizr.dsl.identifier" : "integrationdatadoglistener" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "72", + "id" : "242", + "properties" : { + "structurizr.dsl.identifier" : "integrationdatadogdelegate" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Listens to", + "destinationId" : "46", + "id" : "243", + "properties" : { + "structurizr.dsl.identifier" : "integrationteamslistener" + }, + "sourceId" : "68", + "tags" : "Relationship" + }, { + "description" : "Delegates to", + "destinationId" : "71", + "id" : "245", + "properties" : { + "structurizr.dsl.identifier" : "integrationteamsdelegate" + }, + "sourceId" : "68", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Fetches the relevant configurations when an event comes in and hands the event to its paired integration handler for processing.", + "documentation" : { }, + "id" : "69", + "name" : "EventIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.event_integration_handler" + }, + "relationships" : [ { + "description" : "Publishes To", + "destinationId" : "35", + "id" : "222", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlerpublish" + }, + "sourceId" : "69", + "tags" : "Relationship" + }, { + "description" : "Publishes To", + "destinationId" : "33", + "id" : "223", + "linkedRelationshipId" : "222", + "sourceId" : "69" + }, { + "description" : "Fetches configurations from", + "destinationId" : "74", + "id" : "225", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlercache" + }, + "sourceId" : "69", + "tags" : "Relationship" + }, { + "description" : "Fetches template details from", + "destinationId" : "11", + "id" : "226", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlerdatabase" + }, + "sourceId" : "69", + "tags" : "Relationship" + }, { + "description" : "Runs filters", + "destinationId" : "78", + "id" : "229", + "properties" : { + "structurizr.dsl.identifier" : "eventintegrationhandlerfilter" + }, + "sourceId" : "69", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Processes Slack IntegrationMessages, posting them to the configured channels.", + "documentation" : { }, + "id" : "70", + "name" : "SlackIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.slack_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "75", + "id" : "301", + "properties" : { + "structurizr.dsl.identifier" : "slacktoslackservice" + }, + "sourceId" : "70", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Processes Teams IntegrationMessages, posting them to the configured channels.", + "documentation" : { }, + "id" : "71", + "name" : "TeamsIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.teams_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "76", + "id" : "308", + "properties" : { + "structurizr.dsl.identifier" : "teamstoteamsservice" + }, + "sourceId" : "71", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Processes Datadog IntegrationMessages, posting them to the configured URI.", + "documentation" : { }, + "id" : "72", + "name" : "DatadogIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.datadog_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "77", + "id" : "314", + "properties" : { + "structurizr.dsl.identifier" : "datadoghandlerhttpclient" + }, + "sourceId" : "72", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Processes Webhook and HEC IntegrationMessages, posting them to the configured URI.", + "documentation" : { }, + "id" : "73", + "name" : "WebhookIntegrationHandler", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.webhook_integration_handler" + }, + "relationships" : [ { + "description" : "Uses", + "destinationId" : "77", + "id" : "313", + "properties" : { + "structurizr.dsl.identifier" : "webhookhandlerhttpclient" + }, + "sourceId" : "73", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Caches all configurations for integrations so that events can be handled without adding database load.", + "documentation" : { }, + "id" : "74", + "name" : "EventIntegrationsExtendedCache", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.event_integrations_extended_cache" + }, + "relationships" : [ { + "description" : "Fetches configurations from", + "destinationId" : "11", + "id" : "228", + "properties" : { + "structurizr.dsl.identifier" : "cachedatabasefetch" + }, + "sourceId" : "74", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Handles all API interaction with Slack.", + "documentation" : { }, + "id" : "75", + "name" : "SlackService", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.slack_service" + }, + "relationships" : [ { + "description" : "Publishes configured events to", + "destinationId" : "93", + "id" : "302", + "properties" : { + "structurizr.dsl.identifier" : "slackservicetoslack" + }, + "sourceId" : "75", + "tags" : "Relationship" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "303", + "linkedRelationshipId" : "302", + "sourceId" : "75" + } ], + "tags" : "Element,Component" + }, { + "description" : "Handles all API interaction with Teams.", + "documentation" : { }, + "id" : "76", + "name" : "TeamsService", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.teams_service" + }, + "relationships" : [ { + "description" : "Publishes configured events to", + "destinationId" : "94", + "id" : "309", + "properties" : { + "structurizr.dsl.identifier" : "teamsservicetoteams" + }, + "sourceId" : "76", + "tags" : "Relationship" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "310", + "linkedRelationshipId" : "309", + "sourceId" : "76" + } ], + "tags" : "Element,Component" + }, { + "description" : "Performs any HTTP functions for Datadog / Webhooks / HEC.", + "documentation" : { }, + "id" : "77", + "name" : "HttpClient", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.http_client" + }, + "relationships" : [ { + "description" : "Publishes configured events to", + "destinationId" : "97", + "id" : "315", + "properties" : { + "structurizr.dsl.identifier" : "httptocrowdstrike" + }, + "sourceId" : "77", + "tags" : "Relationship" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "316", + "linkedRelationshipId" : "315", + "sourceId" : "77" + }, { + "description" : "Publishes configured events to", + "destinationId" : "96", + "id" : "319", + "properties" : { + "structurizr.dsl.identifier" : "httptodatadog" + }, + "sourceId" : "77", + "tags" : "Relationship" + }, { + "description" : "Publishes configured events to", + "destinationId" : "95", + "id" : "322", + "properties" : { + "structurizr.dsl.identifier" : "httptosplunk" + }, + "sourceId" : "77", + "tags" : "Relationship" + } ], + "tags" : "Element,Component" + }, { + "description" : "Processes filters from configurations to determine if an event should be processed out to the integration.", + "documentation" : { }, + "id" : "78", + "name" : "IntegrationFilterService", + "properties" : { + "structurizr.dsl.identifier" : "server.events_processor.integration_filter_service" + }, + "tags" : "Element,Component" + } ], "documentation" : { }, "id" : "10", "name" : "Events Processor", "properties" : { "structurizr.dsl.identifier" : "server.events_processor" }, - "tags" : "Element,Container,Events" + "relationships" : [ { + "description" : "Listens to", + "destinationId" : "36", + "id" : "208", + "linkedRelationshipId" : "206", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "33", + "id" : "209", + "linkedRelationshipId" : "206", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "40", + "id" : "212", + "linkedRelationshipId" : "211", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "39", + "id" : "214", + "linkedRelationshipId" : "213", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "37", + "id" : "216", + "linkedRelationshipId" : "215", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "41", + "id" : "218", + "linkedRelationshipId" : "217", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "38", + "id" : "220", + "linkedRelationshipId" : "219", + "sourceId" : "10" + }, { + "description" : "Publishes To", + "destinationId" : "35", + "id" : "224", + "linkedRelationshipId" : "222", + "sourceId" : "10" + }, { + "description" : "Fetches template details from", + "destinationId" : "11", + "id" : "227", + "linkedRelationshipId" : "226", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "42", + "id" : "233", + "linkedRelationshipId" : "231", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "43", + "id" : "236", + "linkedRelationshipId" : "235", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "44", + "id" : "239", + "linkedRelationshipId" : "238", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "45", + "id" : "241", + "linkedRelationshipId" : "240", + "sourceId" : "10" + }, { + "description" : "Listens to", + "destinationId" : "46", + "id" : "244", + "linkedRelationshipId" : "243", + "sourceId" : "10" + }, { + "description" : "Publishes configured events to", + "destinationId" : "93", + "id" : "304", + "linkedRelationshipId" : "302", + "sourceId" : "10" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "305", + "linkedRelationshipId" : "302", + "sourceId" : "10" + }, { + "description" : "Publishes configured events to", + "destinationId" : "94", + "id" : "311", + "linkedRelationshipId" : "309", + "sourceId" : "10" + }, { + "description" : "Publishes configured events to", + "destinationId" : "97", + "id" : "317", + "linkedRelationshipId" : "315", + "sourceId" : "10" + }, { + "description" : "Publishes configured events to", + "destinationId" : "96", + "id" : "320", + "linkedRelationshipId" : "319", + "sourceId" : "10" + }, { + "description" : "Publishes configured events to", + "destinationId" : "95", + "id" : "323", + "linkedRelationshipId" : "322", + "sourceId" : "10" + } ], + "tags" : "Element,Container,Events,Cloud-Only" }, { "documentation" : { }, "id" : "11", @@ -321,21 +1522,6 @@ }, { "documentation" : { }, "id" : "12", - "name" : "Events Queue", - "properties" : { - "structurizr.dsl.identifier" : "server.events_queue" - }, - "relationships" : [ { - "description" : "Processes events from", - "destinationId" : "10", - "id" : "98", - "sourceId" : "12", - "tags" : "Relationship" - } ], - "tags" : "Element,Container,Queue,Azure" - }, { - "documentation" : { }, - "id" : "13", "name" : "Mail Queue", "properties" : { "structurizr.dsl.identifier" : "server.mail_queue" @@ -343,14 +1529,14 @@ "relationships" : [ { "description" : "Processes emails from", "destinationId" : "9", - "id" : "99", - "sourceId" : "13", + "id" : "160", + "sourceId" : "12", "tags" : "Relationship" } ], "tags" : "Element,Container,Queue,Azure" }, { "documentation" : { }, - "id" : "14", + "id" : "13", "name" : "Notifications Queue", "properties" : { "structurizr.dsl.identifier" : "server.notifications_queue" @@ -358,7 +1544,7 @@ "tags" : "Element,Container,Queue,Azure" }, { "documentation" : { }, - "id" : "27", + "id" : "26", "name" : "SCIM", "properties" : { "structurizr.dsl.identifier" : "server.scim" @@ -366,14 +1552,38 @@ "relationships" : [ { "description" : "Queries", "destinationId" : "11", - "id" : "102", - "sourceId" : "27", + "id" : "163", + "sourceId" : "26", "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "34", + "id" : "183", + "sourceId" : "26", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "33", + "id" : "184", + "linkedRelationshipId" : "183", + "sourceId" : "26" + }, { + "description" : "Sends events to", + "destinationId" : "48", + "id" : "193", + "sourceId" : "26", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "47", + "id" : "194", + "linkedRelationshipId" : "193", + "sourceId" : "26" } ], "tags" : "Element,Container,SCIM" }, { "documentation" : { }, - "id" : "30", + "id" : "29", "name" : "Identity", "properties" : { "structurizr.dsl.identifier" : "server.identity" @@ -381,14 +1591,38 @@ "relationships" : [ { "description" : "Queries", "destinationId" : "11", - "id" : "103", - "sourceId" : "30", + "id" : "164", + "sourceId" : "29", "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "34", + "id" : "179", + "sourceId" : "29", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "33", + "id" : "180", + "linkedRelationshipId" : "179", + "sourceId" : "29" + }, { + "description" : "Sends events to", + "destinationId" : "48", + "id" : "189", + "sourceId" : "29", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "47", + "id" : "190", + "linkedRelationshipId" : "189", + "sourceId" : "29" } ], "tags" : "Element,Container,Auth" }, { "documentation" : { }, - "id" : "31", + "id" : "30", "name" : "SSO", "properties" : { "structurizr.dsl.identifier" : "server.sso" @@ -396,35 +1630,607 @@ "relationships" : [ { "description" : "Queries", "destinationId" : "11", - "id" : "104", - "sourceId" : "31", + "id" : "165", + "sourceId" : "30", "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "34", + "id" : "181", + "sourceId" : "30", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "33", + "id" : "182", + "linkedRelationshipId" : "181", + "sourceId" : "30" + }, { + "description" : "Sends events to", + "destinationId" : "48", + "id" : "191", + "sourceId" : "30", + "tags" : "Relationship" + }, { + "description" : "Sends events to", + "destinationId" : "47", + "id" : "192", + "linkedRelationshipId" : "191", + "sourceId" : "30" } ], "tags" : "Element,Container,Auth" }, { "components" : [ { - "description" : "IconsController", + "description" : "The main entry point for all events in the system. When an event occurs, it is published to this topic.", + "documentation" : { }, + "id" : "34", + "name" : "Event Topic", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.event_topic" + }, + "relationships" : [ { + "description" : "Subscribes via fan-out", + "destinationId" : "36", + "id" : "195", + "properties" : { + "structurizr.dsl.identifier" : "eventswritesub" + }, + "sourceId" : "34", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "40", + "id" : "196", + "properties" : { + "structurizr.dsl.identifier" : "eventsdatadogsub" + }, + "sourceId" : "34", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "39", + "id" : "197", + "properties" : { + "structurizr.dsl.identifier" : "eventshecsub" + }, + "sourceId" : "34", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "37", + "id" : "198", + "properties" : { + "structurizr.dsl.identifier" : "eventsslacksub" + }, + "sourceId" : "34", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "41", + "id" : "199", + "properties" : { + "structurizr.dsl.identifier" : "eventsteamssub" + }, + "sourceId" : "34", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "38", + "id" : "200", + "properties" : { + "structurizr.dsl.identifier" : "eventswebhooksub" + }, + "sourceId" : "34", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,Events,ASB,Event Tier" + }, { + "description" : "Events that have integrations configured are processed and put on the integration topic with a routing key for their specific integration handler to process.", "documentation" : { }, "id" : "35", + "name" : "Integration Topic", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.integration_topic" + }, + "relationships" : [ { + "description" : "Subscribes via filter on Datadog key", + "destinationId" : "45", + "id" : "201", + "properties" : { + "structurizr.dsl.identifier" : "integrationdatadogsub" + }, + "sourceId" : "35", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on HEC key", + "destinationId" : "44", + "id" : "202", + "properties" : { + "structurizr.dsl.identifier" : "integrationhecsub" + }, + "sourceId" : "35", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on Slack key", + "destinationId" : "42", + "id" : "203", + "properties" : { + "structurizr.dsl.identifier" : "integrationslacksub" + }, + "sourceId" : "35", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on Teams key", + "destinationId" : "46", + "id" : "204", + "properties" : { + "structurizr.dsl.identifier" : "integrationteamssub" + }, + "sourceId" : "35", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on Webhook key", + "destinationId" : "43", + "id" : "205", + "properties" : { + "structurizr.dsl.identifier" : "integrationwebhooksub" + }, + "sourceId" : "35", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,Events,ASB,Integrations,Integration Tier" + }, { + "description" : "Subscription for EventRepositoryHandler to write all events into azure table storage.", + "documentation" : { }, + "id" : "36", + "name" : "events-write-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.eventswritesub" + }, + "tags" : "Element,Component,ASB,Subscription,Event Tier" + }, { + "description" : "Subscription for slack-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Slack integration configured.", + "documentation" : { }, + "id" : "37", + "name" : "events-slack-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.eventsslacksub" + }, + "tags" : "Element,Component,ASB,Subscription,Event Tier,Slack" + }, { + "description" : "Subscription for webhook-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a webhook integration configured.", + "documentation" : { }, + "id" : "38", + "name" : "events-webhook-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.eventswebhooksub" + }, + "tags" : "Element,Component,ASB,Subscription,Event Tier,Webhook" + }, { + "description" : "Subscription for HEC-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a HEC integration configured.", + "documentation" : { }, + "id" : "39", + "name" : "events-hec-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.eventshecsub" + }, + "tags" : "Element,Component,ASB,Subscription,Event Tier,HEC" + }, { + "description" : "Subscription for Datadog-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Datadog integration configured.", + "documentation" : { }, + "id" : "40", + "name" : "events-datadog-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.eventsdatadogsub" + }, + "tags" : "Element,Component,ASB,Subscription,Event Tier,Datadog" + }, { + "description" : "Subscription for Microsoft Teams-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Teams integration configured.", + "documentation" : { }, + "id" : "41", + "name" : "events-teams-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.eventsteamssub" + }, + "tags" : "Element,Component,ASB,Subscription,Event Tier,Teams" + }, { + "description" : "Integration-level subscription for Slack IntegrationMessages. Correlation filter: Label = 'slack'.", + "documentation" : { }, + "id" : "42", + "name" : "integration-slack-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.integrationslacksub" + }, + "tags" : "Element,Component,ASB,Subscription,Integration Tier,Slack" + }, { + "description" : "Integration-level subscription for Webhook IntegrationMessages. Correlation filter: Label = 'webhook'.", + "documentation" : { }, + "id" : "43", + "name" : "integration-webhook-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.integrationwebhooksub" + }, + "tags" : "Element,Component,ASB,Subscription,Integration Tier,Webhook" + }, { + "description" : "Integration-level subscription for HEC IntegrationMessages. Correlation filter: Label = 'hec'.", + "documentation" : { }, + "id" : "44", + "name" : "integration-hec-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.integrationhecsub" + }, + "tags" : "Element,Component,ASB,Subscription,Integration Tier,HEC" + }, { + "description" : "Integration-level subscription for Datadog IntegrationMessages. Correlation filter: Label = 'datadog'.", + "documentation" : { }, + "id" : "45", + "name" : "integration-datadog-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.integrationdatadogsub" + }, + "tags" : "Element,Component,ASB,Subscription,Integration Tier,Datadog" + }, { + "description" : "Integration-level subscription for Miocrosoft Teams IntegrationMessages. Correlation filter: Label = 'teams'.", + "documentation" : { }, + "id" : "46", + "name" : "integration-teams-subscription", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus.integrationteamssub" + }, + "tags" : "Element,Component,ASB,Subscription,Integration Tier,Teams" + } ], + "description" : "AMQP service used for pub/sub architecture for Events and Integrations", + "documentation" : { }, + "id" : "33", + "name" : "Azure Service Bus", + "properties" : { + "structurizr.dsl.identifier" : "server.azure_service_bus" + }, + "tags" : "Element,Container,Events,Azure,ASB,Cloud-Only" + }, { + "components" : [ { + "documentation" : { }, + "id" : "48", + "name" : "Event Exchange", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.event_exchange" + }, + "relationships" : [ { + "description" : "Subscribes via fan-out", + "destinationId" : "50", + "id" : "246", + "properties" : { + "structurizr.dsl.identifier" : "eventswritequeue" + }, + "sourceId" : "48", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "54", + "id" : "247", + "properties" : { + "structurizr.dsl.identifier" : "eventsdatadogqueue" + }, + "sourceId" : "48", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "53", + "id" : "248", + "properties" : { + "structurizr.dsl.identifier" : "eventshecqueue" + }, + "sourceId" : "48", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "51", + "id" : "249", + "properties" : { + "structurizr.dsl.identifier" : "eventsslackqueue" + }, + "sourceId" : "48", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "55", + "id" : "250", + "properties" : { + "structurizr.dsl.identifier" : "eventsteamsqueue" + }, + "sourceId" : "48", + "tags" : "Relationship" + }, { + "description" : "Subscribes via fan-out", + "destinationId" : "52", + "id" : "251", + "properties" : { + "structurizr.dsl.identifier" : "eventswebhookqueue" + }, + "sourceId" : "48", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,Events,Event Tier" + }, { + "documentation" : { }, + "id" : "49", + "name" : "Integration Exchange", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integration_exchange" + }, + "relationships" : [ { + "description" : "Subscribes via filter on Datadog key", + "destinationId" : "59", + "id" : "252", + "properties" : { + "structurizr.dsl.identifier" : "integrationdatadogqueue" + }, + "sourceId" : "49", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on HEC key", + "destinationId" : "58", + "id" : "253", + "properties" : { + "structurizr.dsl.identifier" : "integrationhecqueue" + }, + "sourceId" : "49", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on Slack key", + "destinationId" : "56", + "id" : "254", + "properties" : { + "structurizr.dsl.identifier" : "integrationslackqueue" + }, + "sourceId" : "49", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on Teams key", + "destinationId" : "60", + "id" : "255", + "properties" : { + "structurizr.dsl.identifier" : "integrationteamsqueue" + }, + "sourceId" : "49", + "tags" : "Relationship" + }, { + "description" : "Subscribes via filter on Webhook key", + "destinationId" : "57", + "id" : "256", + "properties" : { + "structurizr.dsl.identifier" : "integrationwebhookqueue" + }, + "sourceId" : "49", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,Events,Integrations,Integration Tier" + }, { + "description" : "Queue for EventRepositoryHandler to write all events into the database.", + "documentation" : { }, + "id" : "50", + "name" : "events-write-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.eventswritequeue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Event Tier" + }, { + "description" : "Queue for slack-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Slack integration configured.", + "documentation" : { }, + "id" : "51", + "name" : "events-slack-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.eventsslackqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Event Tier,Slack" + }, { + "description" : "Queue for webhook-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a webhook integration configured.", + "documentation" : { }, + "id" : "52", + "name" : "events-webhook-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.eventswebhookqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Event Tier,Webhook" + }, { + "description" : "Queue for HEC-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a HEC integration configured.", + "documentation" : { }, + "id" : "53", + "name" : "events-hec-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.eventshecqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Event Tier,HEC" + }, { + "description" : "Queue for Datadog-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Datadog integration configured.", + "documentation" : { }, + "id" : "54", + "name" : "events-datadog-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.eventsdatadogqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Event Tier,Datadog" + }, { + "description" : "Queue for Microsoft Teams-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Teams integration configured.", + "documentation" : { }, + "id" : "55", + "name" : "events-teams-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.eventsteamsqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Event Tier,Teams" + }, { + "description" : "Integration-level queue for Slack IntegrationMessages. Routing key = 'slack'.", + "documentation" : { }, + "id" : "56", + "name" : "integration-slack-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationslackqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Slack" + }, { + "description" : "Integration-level queue for Webhook IntegrationMessages. Routing key = 'webhook'.", + "documentation" : { }, + "id" : "57", + "name" : "integration-webhook-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationwebhookqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Webhook" + }, { + "description" : "Integration-level queue for HEC IntegrationMessages. Routing key = 'hec'.", + "documentation" : { }, + "id" : "58", + "name" : "integration-hec-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationhecqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,HEC" + }, { + "description" : "Integration-level queue for Datadog IntegrationMessages. Routing key = 'datadog'.", + "documentation" : { }, + "id" : "59", + "name" : "integration-datadog-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationdatadogqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Datadog" + }, { + "description" : "Integration-level queue for Teams IntegrationMessages. Routing key = 'teams'.", + "documentation" : { }, + "id" : "60", + "name" : "integration-teams-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationteamsqueue" + }, + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Teams" + }, { + "description" : "Integration-level retry queue for Slack IntegrationMessages. Routing key Label = 'slack-retry'.", + "documentation" : { }, + "id" : "61", + "name" : "integration-slack-retry-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationslackretryqueue" + }, + "relationships" : [ { + "description" : "DLQ after configured retry timing", + "destinationId" : "56", + "id" : "259", + "properties" : { + "structurizr.dsl.identifier" : "integrationslackretryqueue" + }, + "sourceId" : "61", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Slack" + }, { + "description" : "Integration-level retry queue for Webhook IntegrationMessages. Routing key = 'webhook-retry'.", + "documentation" : { }, + "id" : "62", + "name" : "integration-webhook-retry-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationwebhookretryqueue" + }, + "relationships" : [ { + "description" : "DLQ after configured retry timing", + "destinationId" : "57", + "id" : "261", + "properties" : { + "structurizr.dsl.identifier" : "integrationwebhookretryqueue" + }, + "sourceId" : "62", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Webhook" + }, { + "description" : "Integration-level retry queue for HEC IntegrationMessages. Routing key = 'hec-retry'.", + "documentation" : { }, + "id" : "63", + "name" : "integration-hec-retry-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationhecretryqueue" + }, + "relationships" : [ { + "description" : "DLQ after configured retry timing", + "destinationId" : "58", + "id" : "258", + "properties" : { + "structurizr.dsl.identifier" : "integrationhecretryqueue" + }, + "sourceId" : "63", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,HEC" + }, { + "description" : "Integration-level retry queue for Datadog IntegrationMessages. Routing key = 'datadog-retry'.", + "documentation" : { }, + "id" : "64", + "name" : "integration-datadog-retry-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationdatadogretryqueue" + }, + "relationships" : [ { + "description" : "DLQ after configured retry timing", + "destinationId" : "59", + "id" : "257", + "properties" : { + "structurizr.dsl.identifier" : "integrationdatadogretryqueue" + }, + "sourceId" : "64", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Datadog" + }, { + "description" : "Integration-level retry queue for Teams IntegrationMessages. Routing key = 'teams-retry'.", + "documentation" : { }, + "id" : "65", + "name" : "integration-teams-retry-queue", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq.integrationteamsretryqueue" + }, + "relationships" : [ { + "description" : "DLQ after configured retry timing", + "destinationId" : "60", + "id" : "260", + "properties" : { + "structurizr.dsl.identifier" : "integrationteamsretryqueue" + }, + "sourceId" : "65", + "tags" : "Relationship" + } ], + "tags" : "Element,Component,RabbitMQ,Queue,Integration Tier,Teams" + } ], + "documentation" : { }, + "id" : "47", + "name" : "RabbitMQ", + "properties" : { + "structurizr.dsl.identifier" : "server.rabbit_mq" + }, + "tags" : "Element,Container,Events,RabbitMQ,Self-Hosted-Only" + }, { + "components" : [ { + "description" : "IconsController", + "documentation" : { }, + "id" : "99", "name" : "IconsController", "properties" : { "structurizr.dsl.identifier" : "server.icons.icons_controller" }, "relationships" : [ { "description" : "Requests icons from", - "destinationId" : "37", - "id" : "42", - "sourceId" : "35", + "destinationId" : "101", + "id" : "106", + "sourceId" : "99", "tags" : "Relationship" }, { "description" : "Caches icons in", - "destinationId" : "38", - "id" : "43", + "destinationId" : "102", + "id" : "107", "perspectives" : [ { "description" : "Icons 1.3.1 Aggregate vault content leak through timing attack on cache \n\n Icons 1.3.2 Possible injection attack through cache key \n\n Icons 1.3.3 & Icons 1.3.4 Cache bloat leading to DoS \n\n Icons 1.3.5 Cache poisoning leading to incorrect icon storage", "name" : "Security" } ], - "sourceId" : "35", + "sourceId" : "99", "tags" : "Relationship" } ], "tags" : "Element,Component", @@ -432,7 +2238,7 @@ }, { "description" : "Provides information about the deployed icon service. Allow for health checks.", "documentation" : { }, - "id" : "36", + "id" : "100", "name" : "InfoController", "properties" : { "structurizr.dsl.identifier" : "server.icons.info_controller" @@ -442,29 +2248,29 @@ }, { "description" : "Resolves a single source for a website icon and downloads it.", "documentation" : { }, - "id" : "37", + "id" : "101", "name" : "IconDetermination", "properties" : { "structurizr.dsl.identifier" : "server.icons.icon_determination" }, "relationships" : [ { "description" : "Resolves IP addresses for domain names from", - "destinationId" : "44", - "id" : "45", - "sourceId" : "37", + "destinationId" : "108", + "id" : "109", + "sourceId" : "101", "tags" : "Relationship" }, { "description" : "Retrieves icons from", - "destinationId" : "48", - "id" : "49", - "sourceId" : "37", + "destinationId" : "112", + "id" : "113", + "sourceId" : "101", "tags" : "Relationship" } ], "tags" : "Element,Component" }, { "description" : "Caches icons for a given domain", "documentation" : { }, - "id" : "38", + "id" : "102", "name" : "IconCache", "properties" : { "structurizr.dsl.identifier" : "server.icons.icon_cache" @@ -480,23 +2286,23 @@ "title" : "" } ] }, - "id" : "34", + "id" : "98", "name" : "Icons", "properties" : { "structurizr.dsl.identifier" : "server.icons" }, "relationships" : [ { "description" : "Resolves IP addresses for domain names from", - "destinationId" : "44", - "id" : "46", - "linkedRelationshipId" : "45", - "sourceId" : "34" + "destinationId" : "108", + "id" : "110", + "linkedRelationshipId" : "109", + "sourceId" : "98" }, { "description" : "Retrieves icons from", - "destinationId" : "48", - "id" : "50", - "linkedRelationshipId" : "49", - "sourceId" : "34" + "destinationId" : "112", + "id" : "114", + "linkedRelationshipId" : "113", + "sourceId" : "98" } ], "tags" : "Element,Container" } ], @@ -510,34 +2316,70 @@ }, "relationships" : [ { "description" : "Resolves IP addresses for domain names from", - "destinationId" : "44", - "id" : "47", - "linkedRelationshipId" : "45", + "destinationId" : "108", + "id" : "111", + "linkedRelationshipId" : "109", "sourceId" : "4" }, { "description" : "Retrieves icons from", - "destinationId" : "48", - "id" : "51", - "linkedRelationshipId" : "49", + "destinationId" : "112", + "id" : "115", + "linkedRelationshipId" : "113", + "sourceId" : "4" + }, { + "description" : "Requests payments for customers", + "destinationId" : "31", + "id" : "168", + "linkedRelationshipId" : "166", "sourceId" : "4" }, { "description" : "Requests payments for customers", "destinationId" : "32", - "id" : "107", - "linkedRelationshipId" : "105", + "id" : "171", + "linkedRelationshipId" : "169", "sourceId" : "4" }, { - "description" : "Requests payments for customers", - "destinationId" : "33", - "id" : "110", - "linkedRelationshipId" : "108", + "description" : "Publishes configured events to", + "destinationId" : "93", + "id" : "306", + "linkedRelationshipId" : "302", + "sourceId" : "4" + }, { + "description" : "Publishes configured events to", + "destinationId" : "92", + "id" : "307", + "linkedRelationshipId" : "302", + "sourceId" : "4" + }, { + "description" : "Publishes configured events to", + "destinationId" : "94", + "id" : "312", + "linkedRelationshipId" : "309", + "sourceId" : "4" + }, { + "description" : "Publishes configured events to", + "destinationId" : "97", + "id" : "318", + "linkedRelationshipId" : "315", + "sourceId" : "4" + }, { + "description" : "Publishes configured events to", + "destinationId" : "96", + "id" : "321", + "linkedRelationshipId" : "319", + "sourceId" : "4" + }, { + "description" : "Publishes configured events to", + "destinationId" : "95", + "id" : "324", + "linkedRelationshipId" : "322", "sourceId" : "4" } ], "tags" : "Element,Software System" }, { "containers" : [ { "documentation" : { }, - "id" : "16", + "id" : "15", "name" : "Web Application", "properties" : { "structurizr.dsl.identifier" : "clients.web" @@ -545,26 +2387,26 @@ "relationships" : [ { "description" : "Makes requests to", "destinationId" : "5", - "id" : "69", - "sourceId" : "16", + "id" : "133", + "sourceId" : "15", "tags" : "Relationship" }, { "description" : "Makes requests to", "destinationId" : "4", - "id" : "70", - "linkedRelationshipId" : "69", - "sourceId" : "16" + "id" : "134", + "linkedRelationshipId" : "133", + "sourceId" : "15" }, { "description" : "Authenticates with", - "destinationId" : "30", - "id" : "82", - "sourceId" : "16", + "destinationId" : "29", + "id" : "146", + "sourceId" : "15", "tags" : "Relationship" } ], "tags" : "Element,Container,Web" }, { "documentation" : { }, - "id" : "17", + "id" : "16", "name" : "iOS Application", "properties" : { "structurizr.dsl.identifier" : "clients.ios" @@ -572,26 +2414,26 @@ "relationships" : [ { "description" : "Makes requests to", "destinationId" : "5", - "id" : "72", - "sourceId" : "17", + "id" : "136", + "sourceId" : "16", "tags" : "Relationship" }, { "description" : "Makes requests to", "destinationId" : "4", - "id" : "73", - "linkedRelationshipId" : "72", - "sourceId" : "17" + "id" : "137", + "linkedRelationshipId" : "136", + "sourceId" : "16" }, { "description" : "Authenticates With", - "destinationId" : "30", - "id" : "84", - "sourceId" : "17", + "destinationId" : "29", + "id" : "148", + "sourceId" : "16", "tags" : "Relationship" } ], "tags" : "Element,Container,Mobile" }, { "documentation" : { }, - "id" : "18", + "id" : "17", "name" : "Android Application", "properties" : { "structurizr.dsl.identifier" : "clients.android" @@ -599,26 +2441,26 @@ "relationships" : [ { "description" : "Makes requests to", "destinationId" : "5", - "id" : "74", - "sourceId" : "18", + "id" : "138", + "sourceId" : "17", "tags" : "Relationship" }, { "description" : "Makes requests to", "destinationId" : "4", - "id" : "75", - "linkedRelationshipId" : "74", - "sourceId" : "18" + "id" : "139", + "linkedRelationshipId" : "138", + "sourceId" : "17" }, { "description" : "Authenticates With", - "destinationId" : "30", - "id" : "85", - "sourceId" : "18", + "destinationId" : "29", + "id" : "149", + "sourceId" : "17", "tags" : "Relationship" } ], "tags" : "Element,Container,Mobile" }, { "documentation" : { }, - "id" : "19", + "id" : "18", "name" : "Browser Extension", "properties" : { "structurizr.dsl.identifier" : "clients.browser_extension" @@ -626,26 +2468,26 @@ "relationships" : [ { "description" : "Makes requests to", "destinationId" : "5", - "id" : "76", - "sourceId" : "19", + "id" : "140", + "sourceId" : "18", "tags" : "Relationship" }, { "description" : "Makes requests to", "destinationId" : "4", - "id" : "77", - "linkedRelationshipId" : "76", - "sourceId" : "19" + "id" : "141", + "linkedRelationshipId" : "140", + "sourceId" : "18" }, { "description" : "Authenticates With", - "destinationId" : "30", - "id" : "86", - "sourceId" : "19", + "destinationId" : "29", + "id" : "150", + "sourceId" : "18", "tags" : "Relationship" } ], "tags" : "Element,Container,Browser" }, { "documentation" : { }, - "id" : "20", + "id" : "19", "name" : "CLI", "properties" : { "structurizr.dsl.identifier" : "clients.cli" @@ -653,26 +2495,26 @@ "relationships" : [ { "description" : "Makes requests to", "destinationId" : "5", - "id" : "78", - "sourceId" : "20", + "id" : "142", + "sourceId" : "19", "tags" : "Relationship" }, { "description" : "Makes requests to", "destinationId" : "4", - "id" : "79", - "linkedRelationshipId" : "78", - "sourceId" : "20" + "id" : "143", + "linkedRelationshipId" : "142", + "sourceId" : "19" }, { "description" : "Authenticates With", - "destinationId" : "30", - "id" : "87", - "sourceId" : "20", + "destinationId" : "29", + "id" : "151", + "sourceId" : "19", "tags" : "Relationship" } ], "tags" : "Element,Container,CLI" }, { "documentation" : { }, - "id" : "21", + "id" : "20", "name" : "Desktop Application", "properties" : { "structurizr.dsl.identifier" : "clients.desktop" @@ -680,27 +2522,27 @@ "relationships" : [ { "description" : "Makes requests to", "destinationId" : "5", - "id" : "80", - "sourceId" : "21", + "id" : "144", + "sourceId" : "20", "tags" : "Relationship" }, { "description" : "Makes requests to", "destinationId" : "4", - "id" : "81", - "linkedRelationshipId" : "80", - "sourceId" : "21" + "id" : "145", + "linkedRelationshipId" : "144", + "sourceId" : "20" }, { "description" : "Authenticates With", - "destinationId" : "30", - "id" : "88", - "sourceId" : "21", + "destinationId" : "29", + "id" : "152", + "sourceId" : "20", "tags" : "Relationship" } ], "tags" : "Element,Container,Desktop" } ], "documentation" : { }, "group" : "Bitwarden Controlled", - "id" : "15", + "id" : "14", "location" : "Unspecified", "name" : "Clients", "properties" : { @@ -708,50 +2550,50 @@ }, "relationships" : [ { "description" : "Requests icons for cleartext urls from", - "destinationId" : "35", - "id" : "39", + "destinationId" : "99", + "id" : "103", "perspectives" : [ { "description" : "Icons 1.2.1 Broken SSL communication exposes vault contents to network administrators \n\n Icons 1.2.2 Tracking of user vault contents by ip correlation between identity and icons services \n\n Icons 1.2.3 No SLA offered on Icons service, graceful degradation of features needed if it goes down \n\n Icons 1.2.4 SSRF through crafted input resolving to a location the server has elevated privileges in", "name" : "Security" } ], - "sourceId" : "15", + "sourceId" : "14", "tags" : "Relationship" }, { "description" : "Requests icons for cleartext urls from", - "destinationId" : "34", - "id" : "40", - "linkedRelationshipId" : "39", - "sourceId" : "15" + "destinationId" : "98", + "id" : "104", + "linkedRelationshipId" : "103", + "sourceId" : "14" }, { "description" : "Requests icons for cleartext urls from", "destinationId" : "4", - "id" : "41", - "linkedRelationshipId" : "39", - "sourceId" : "15" + "id" : "105", + "linkedRelationshipId" : "103", + "sourceId" : "14" }, { "description" : "Makes requests to", "destinationId" : "5", - "id" : "71", - "linkedRelationshipId" : "69", - "sourceId" : "15" + "id" : "135", + "linkedRelationshipId" : "133", + "sourceId" : "14" }, { "description" : "Authenticates with", - "destinationId" : "30", - "id" : "83", - "linkedRelationshipId" : "82", - "sourceId" : "15" + "destinationId" : "29", + "id" : "147", + "linkedRelationshipId" : "146", + "sourceId" : "14" }, { "description" : "Posts local usage events to", "destinationId" : "7", - "id" : "90", - "sourceId" : "15", + "id" : "154", + "sourceId" : "14", "tags" : "Relationship" } ], "tags" : "Element,Software System" }, { "documentation" : { }, "group" : "Bitwarden Controlled", - "id" : "22", + "id" : "21", "location" : "Unspecified", "name" : "Directory Connector", "properties" : { @@ -760,21 +2602,21 @@ "relationships" : [ { "description" : "Syncs users and groups to Bitwarden", "destinationId" : "5", - "id" : "28", - "sourceId" : "22", + "id" : "27", + "sourceId" : "21", "tags" : "Relationship" }, { "description" : "Syncs users and groups to Bitwarden", "destinationId" : "4", - "id" : "29", - "linkedRelationshipId" : "28", - "sourceId" : "22" + "id" : "28", + "linkedRelationshipId" : "27", + "sourceId" : "21" } ], "tags" : "Element,Software System,Directory,LDAP,Self-Hosted" }, { "documentation" : { }, "group" : "Bitwarden Controlled", - "id" : "23", + "id" : "22", "location" : "Unspecified", "name" : "Key Connector", "properties" : { @@ -782,22 +2624,22 @@ }, "relationships" : [ { "description" : "Validates JWTs with", - "destinationId" : "30", - "id" : "114", - "sourceId" : "23", + "destinationId" : "29", + "id" : "343", + "sourceId" : "22", "tags" : "Relationship" }, { "description" : "Validates JWTs with", "destinationId" : "4", - "id" : "115", - "linkedRelationshipId" : "114", - "sourceId" : "23" + "id" : "344", + "linkedRelationshipId" : "343", + "sourceId" : "22" } ], "tags" : "Element,Software System" }, { "description" : "Self-hosted instances of Bitwarden servers", "documentation" : { }, - "id" : "24", + "id" : "23", "location" : "Unspecified", "name" : "Self-Hosted Instances", "properties" : { @@ -806,22 +2648,22 @@ "relationships" : [ { "description" : "Sends push notification proxy requests to", "destinationId" : "8", - "id" : "100", - "sourceId" : "24", + "id" : "161", + "sourceId" : "23", "tags" : "Relationship" }, { "description" : "Sends push notification proxy requests to", "destinationId" : "4", - "id" : "101", - "linkedRelationshipId" : "100", - "sourceId" : "24" + "id" : "162", + "linkedRelationshipId" : "161", + "sourceId" : "23" } ], "tags" : "Element,Software System,Self-Hosted,External" }, { "description" : "Handles credit cards and subscriptions.", "documentation" : { }, "group" : "Payment Systems", - "id" : "32", + "id" : "31", "location" : "Unspecified", "name" : "Stripe", "properties" : { @@ -830,28 +2672,28 @@ "relationships" : [ { "description" : "Sends subscription events to", "destinationId" : "6", - "id" : "111", - "sourceId" : "32", + "id" : "172", + "sourceId" : "31", "tags" : "Relationship" }, { "description" : "Sends subscription events to", "destinationId" : "5", - "id" : "112", - "linkedRelationshipId" : "111", - "sourceId" : "32" + "id" : "173", + "linkedRelationshipId" : "172", + "sourceId" : "31" }, { "description" : "Sends subscription events to", "destinationId" : "4", - "id" : "113", - "linkedRelationshipId" : "111", - "sourceId" : "32" + "id" : "174", + "linkedRelationshipId" : "172", + "sourceId" : "31" } ], "tags" : "Element,Software System,External,Billing" }, { "description" : "Handles PayPal and cryptocurrency.", "documentation" : { }, "group" : "Payment Systems", - "id" : "33", + "id" : "32", "location" : "Unspecified", "name" : "Braintree", "properties" : { @@ -859,8 +2701,64 @@ }, "tags" : "Element,Software System,External,Billing" }, { + "containers" : [ { + "description" : "Slack messaging service. Receives messages via configured event integrations.", + "documentation" : { }, + "id" : "93", + "name" : "Slack", + "properties" : { + "structurizr.dsl.identifier" : "external_services.slack" + }, + "tags" : "Element,Container,External,Events,Integrations,Slack" + }, { + "description" : "Microsoft Teams messaging service. Receives messages via configured event integrations.", + "documentation" : { }, + "id" : "94", + "name" : "Teams", + "properties" : { + "structurizr.dsl.identifier" : "external_services.teams" + }, + "tags" : "Element,Container,External,Events,Integrations,Teams" + }, { + "description" : "Splunk SIEM service. Receives events via configured event integrations.", + "documentation" : { }, + "id" : "95", + "name" : "Splunk", + "properties" : { + "structurizr.dsl.identifier" : "external_services.splunk" + }, + "tags" : "Element,Container,External,Events,Integrations,Splunk" + }, { + "description" : "Datadog SIEM service. Receives events via configured event integrations.", + "documentation" : { }, + "id" : "96", + "name" : "Datadog", + "properties" : { + "structurizr.dsl.identifier" : "external_services.datadog" + }, + "tags" : "Element,Container,External,Events,Integrations,Datadog" + }, { + "description" : "Crowdstrike Falcon SIEM service. Receives events via configured event integrations.", + "documentation" : { }, + "id" : "97", + "name" : "Crowdstrike Falcon", + "properties" : { + "structurizr.dsl.identifier" : "external_services.crowdstrike" + }, + "tags" : "Element,Container,External,Events,Integrations,Crowdstrike Falcon,Crowdstrike" + } ], + "description" : "External services (e.g. SIEM, Slack, et al) that consume events via integrations", "documentation" : { }, - "id" : "44", + "id" : "92", + "location" : "Unspecified", + "name" : "External Services", + "properties" : { + "structurizr.dsl.identifier" : "external_services" + }, + "tags" : "Element,Software System,External,Events,Integrations" + }, { + "documentation" : { }, + "id" : "108", "location" : "Unspecified", "name" : "DNS", "properties" : { @@ -869,7 +2767,7 @@ "tags" : "Element,Software System,External,Icons" }, { "documentation" : { }, - "id" : "48", + "id" : "112", "location" : "Unspecified", "name" : "External Websites", "properties" : { @@ -880,62 +2778,752 @@ }, "name" : "Bitwarden Server System", "properties" : { - "structurizr.dsl" : "d29ya3NwYWNlICJCaXR3YXJkZW4gU2VydmVyIFN5c3RlbSIgewoKICAhaWRlbnRpZmllcnMgaGllcmFyY2hpY2FsCgogICFkb2NzICJ1c2FnZV9kb2NzIgogIG1vZGVsIHsKICAgIHByb3BlcnRpZXMgewogICAgICAic3RydWN0dXJpenIuZ3JvdXBTZXBhcmF0b3IiICIvIgogICAgfQoKICAgICMgSW5jbHVkZSBzaGFyZWQgbGV2ZWwgbW9kZWxzCiAgICAjIFBlcnNvbiB0eXBlcwogICAgdXNlciA9IHBlcnNvbiAiQml0d2FyZGVuIFVzZXIiICJBbiBlbmQgdXNlciBvZiB0aGUgQml0d2FyZGVuIFN5c3RlbSIKICAgIHN5c3RlbV9hZG1pbiA9IHBlcnNvbiAiU3lzdGVtIEFkbWluIiAiRWl0aGVyIGEgQml0d2FyZGVuIHNpdGUtcmVsaWFiaWxpdHkgZW5naW5lZXIgb3IgYWRtaW5pc3RyYXRvciBvZiBhIHNlbGYtaG9zdGVkIGluc3RhbmNlIiB7CiAgICAgIHRhZ3MgIkJpdHdhcmRlbiBFbXBsb3llZSIgIlNlbGYtSG9zdCBBZG1pbiIKICAgIH0KICAgIAogICAgCiAgICBid19jb250cm9sbGVkID0gZ3JvdXAgIkJpdHdhcmRlbiBDb250cm9sbGVkIiB7CiAgICAgICMgQml0d2FyZGVuIHN0YWZmCiAgICAgIGN1c3RvbWVyX3N1Y2Nlc3MgPSBwZXJzb24gIkN1c3RvbWVyIFN1Y2Nlc3MiICJBIGN1c3RvbWVyIHN1Y2Nlc3MgZW5naW5lZXIuIEluc3BlY3RzIGJpdHdhcmRlbiBzdGF0ZSB0aHJvdWdoIHRoZSBhZG1pbiBwb3J0YWwgYW5kIGludGVybmFsIHRvb2xzIiB7CiAgICAgICAgdGFncyAiQml0d2FyZGVuIEVtcGxveWVlIgogICAgICB9CiAgICAgIAogICAgICAjIFJvb3Qgc3lzdGVtcwogICAgICBzZXJ2ZXIgPSBzb2Z0d2FyZVN5c3RlbSAiQml0d2FyZGVuIFNlcnZlciIgewogICAgICAgIGFwaSA9IGNvbnRhaW5lciAiQVBJIiB7CiAgICAgICAgICBiaWxsaW5nID0gY29tcG9uZW50ICJCaWxsaW5nIiB7CiAgICAgICAgICAgIHRhZ3MgIkJpbGxpbmciCiAgICAgICAgICB9CiAgICAgICAgICB0YWdzICJBUEkiCiAgICAgICAgfQogICAgICAgIGV2ZW50cyA9IGNvbnRhaW5lciAiRXZlbnRzIiB7CiAgICAgICAgICB0YWdzICJFdmVudHMiCiAgICAgICAgfQogICAgICAgIG5vdGlmaWNhdGlvbnMgPSBjb250YWluZXIgIk5vdGlmaWNhdGlvbnMiCiAgICAgICAgcG9ydGFsID0gY29udGFpbmVyICJCaXR3YXJkZW4gUG9ydGFsIiB7CiAgICAgICAgICB0YWdzICJXZWIiCiAgICAgICAgfQogICAgICAgIGV2ZW50c19wcm9jZXNzb3IgPSBjb250YWluZXIgIkV2ZW50cyBQcm9jZXNzb3IiIHsKICAgICAgICAgIHRhZ3MgIkV2ZW50cyIKICAgICAgICB9CiAgICAKICAgICAgICAjIERhdGEgc3RvcmVzCiAgICAgICAgZGF0YWJhc2UgPSBjb250YWluZXIgIkRhdGFiYXNlIiB7CiAgICAgICAgICB0YWdzICJEYXRhYmFzZSIKICAgICAgICB9CiAgICAgICAgZXZlbnRzX3F1ZXVlID0gY29udGFpbmVyICJFdmVudHMgUXVldWUiIHsKICAgICAgICAgIHRhZ3MgIlF1ZXVlIgogICAgICAgICAgdGFncyAiQXp1cmUiCiAgICAgICAgfQogICAgICAgIG1haWxfcXVldWUgPSBjb250YWluZXIgIk1haWwgUXVldWUiIHsKICAgICAgICAgIHRhZ3MgIlF1ZXVlIgogICAgICAgICAgdGFncyAiQXp1cmUiCiAgICAgICAgfQogICAgICAgIG5vdGlmaWNhdGlvbnNfcXVldWUgPSBjb250YWluZXIgIk5vdGlmaWNhdGlvbnMgUXVldWUiIHsKICAgICAgICAgIHRhZ3MgIlF1ZXVlIgogICAgICAgICAgdGFncyAiQXp1cmUiCiAgICAgICAgfQogICAgICB9CiAgICAgIGNsaWVudHMgPSBzb2Z0d2FyZVN5c3RlbSAiQ2xpZW50cyIgewogICAgICAgIHdlYiA9IGNvbnRhaW5lciAiV2ViIEFwcGxpY2F0aW9uIiB7CiAgICAgICAgICB0YWdzICJXZWIiCiAgICAgICAgfQogICAgICAgIGlvcyA9IGNvbnRhaW5lciAiaU9TIEFwcGxpY2F0aW9uIiB7CiAgICAgICAgICB0YWdzICJNb2JpbGUiCiAgICAgICAgfQogICAgICAgIGFuZHJvaWQgPSBjb250YWluZXIgIkFuZHJvaWQgQXBwbGljYXRpb24iIHsKICAgICAgICAgIHRhZ3MgIk1vYmlsZSIKICAgICAgICB9CiAgICAgICAgYnJvd3Nlcl9leHRlbnNpb24gPSBjb250YWluZXIgIkJyb3dzZXIgRXh0ZW5zaW9uIiB7CiAgICAgICAgICB0YWdzICJCcm93c2VyIgogICAgICAgIH0KICAgICAgICBjbGkgPSBjb250YWluZXIgIkNMSSIgewogICAgICAgICAgdGFncyAiQ0xJIgogICAgICAgIH0KICAgICAgICBkZXNrdG9wID0gY29udGFpbmVyICJEZXNrdG9wIEFwcGxpY2F0aW9uIiB7CiAgICAgICAgICB0YWdzICJEZXNrdG9wIgogICAgICAgIH0KICAgICAgfQogICAgICBkaXJlY3RvcnlfY29ubmVjdG9yID0gc29mdHdhcmVTeXN0ZW0gIkRpcmVjdG9yeSBDb25uZWN0b3IiIHsKICAgICAgICB0YWdzICJEaXJlY3RvcnkiCiAgICAgICAgdGFncyAiTERBUCIKICAgICAgICB0YWdzICJTZWxmLUhvc3RlZCIKICAgICAgfQogICAgICBrZXlfY29ubmVjdG9yID0gc29mdHdhcmVTeXN0ZW0gIktleSBDb25uZWN0b3IiIAogICAgfQogICAgCiAgICBzZWxmX2hvc3RlZF9pbnN0YW5jZXMgPSBzb2Z0d2FyZVN5c3RlbSAiU2VsZi1Ib3N0ZWQgSW5zdGFuY2VzIiB7CiAgICAgIHRhZ3MgIlNlbGYtSG9zdGVkIgogICAgICB0YWdzICJFeHRlcm5hbCIKICAgICAgZGVzY3JpcHRpb24gIlNlbGYtaG9zdGVkIGluc3RhbmNlcyBvZiBCaXR3YXJkZW4gc2VydmVycyIKICAgIH0KCiAgICAjIEluY2x1ZGUgdGVhbSBsZXZlbCBtb2RlbHMKICAgIGFkbWluID0gcGVyc29uICJPcmdhbml6YXRpb24gQWRtaW4iICJBbiBhZG1pbmlzdHJhdG9yIG9mIGFuIG9yZ2FuaXphdGlvbiIgewogICAgICB0YWdzICJBZG1pbiIKICAgIH0KICAgIHByb3ZpZGVyID0gcGVyc29uICJNU1AiICJBbmQgZW1wbG95ZWUgb2YgYSBtYW5hZ2VkIHNlcnZpY2UgcHJvdmlkZXIiIHsKICAgICAgdGFncyAiTVNQIgogICAgfQogICAgCiAgICAhZWxlbWVudCBzZXJ2ZXIgewogICAgICBzY2ltID0gY29udGFpbmVyICJTQ0lNIiB7CiAgICAgICAgdGFncyAiU0NJTSIKICAgICAgfQogICAgfQogICAgCiAgICBkaXJlY3RvcnlfY29ubmVjdG9yIC0+IHNlcnZlci5hcGkgIlN5bmNzIHVzZXJzIGFuZCBncm91cHMgdG8gQml0d2FyZGVuIgogICAgIWVsZW1lbnQgc2VydmVyIHsKICAgICAgaWRlbnRpdHkgPSBjb250YWluZXIgIklkZW50aXR5IiB7CiAgICAgICAgdGFncyAiQXV0aCIKICAgICAgfQogICAgICBzc28gPSBjb250YWluZXIgIlNTTyIgewogICAgICAgIHRhZ3MgIkF1dGgiCiAgICAgIH0KICAgIH0KICAgICMgRXh0ZXJuYWwgdmVuZG9ycwogICAgZ3JvdXAgIlBheW1lbnQgU3lzdGVtcyIgewogICAgICBzdHJpcGUgPSBzb2Z0d2FyZVN5c3RlbSAiU3RyaXBlIiB7CiAgICAgICAgdGFncyAiRXh0ZXJuYWwiCiAgICAgICAgdGFncyAiQmlsbGluZyIKICAgICAgICBkZXNjcmlwdGlvbiAiSGFuZGxlcyBjcmVkaXQgY2FyZHMgYW5kIHN1YnNjcmlwdGlvbnMuIgogICAgICB9CiAgICAgIGJyYWludHJlZSA9IHNvZnR3YXJlU3lzdGVtICJCcmFpbnRyZWUiIHsKICAgICAgICB0YWdzICJFeHRlcm5hbCIKICAgICAgICB0YWdzICJCaWxsaW5nIgogICAgICAgIGRlc2NyaXB0aW9uICJIYW5kbGVzIFBheVBhbCBhbmQgY3J5cHRvY3VycmVuY3kuIgogICAgICB9CiAgICB9CiAgICAKICAgICFlbGVtZW50IHNlcnZlciB7CiAgICAgIGljb25zID0gY29udGFpbmVyICJJY29ucyIgewogICAgICAgICFkb2NzICJ0aHJlYXRfbW9kZWwubWQiCiAgICAgICAgaWNvbnNfY29udHJvbGxlciA9IGNvbXBvbmVudCAiSWNvbnNDb250cm9sbGVyIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiSWNvbnNDb250cm9sbGVyIgogICAgICAgICAgdGVjaG5vbG9neSAiQyMgQVNQLk5FVCBDb3JlIgogICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGluZm9fY29udHJvbGxlciA9IGNvbXBvbmVudCAiSW5mb0NvbnRyb2xsZXIiIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVwbG95ZWQgaWNvbiBzZXJ2aWNlLiBBbGxvdyBmb3IgaGVhbHRoIGNoZWNrcy4iCiAgICAgICAgICB0ZWNobm9sb2d5ICJDIyBBU1AuTkVUIENvcmUiCiAgICAgICAgICB0YWdzICJJbmZvIiAiSGVhbHRoQ2hlY2siCiAgICAgICAgfQogICAgICAgIGljb25fZGV0ZXJtaW5hdGlvbiA9IGNvbXBvbmVudCAiSWNvbkRldGVybWluYXRpb24iIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJSZXNvbHZlcyBhIHNpbmdsZSBzb3VyY2UgZm9yIGEgd2Vic2l0ZSBpY29uIGFuZCBkb3dubG9hZHMgaXQuIgogICAgICAgIH0KICAgICAgICBpY29uX2NhY2hlID0gY29tcG9uZW50ICJJY29uQ2FjaGUiIHsKICAgICAgICAgIGRlc2NyaXB0aW9uICJDYWNoZXMgaWNvbnMgZm9yIGEgZ2l2ZW4gZG9tYWluIgogICAgICAgICAgdGFncyAiQ2FjaGUiCiAgICAgICAgICB0ZWNobm9sb2d5ICJDIyBNZW1vcnlDYWNoZSIKICAgICAgICB9CiAgICAKICAgICAgICBjbGllbnRzIC0+IGljb25zX2NvbnRyb2xsZXIgIlJlcXVlc3RzIGljb25zIGZvciBjbGVhcnRleHQgdXJscyBmcm9tIiB7CiAgICAgICAgICBwZXJzcGVjdGl2ZXMgewogICAgICAgICAgICAiU2VjdXJpdHkiICIgICAgICAgICAgICBJY29ucyAxLjIuMSBCcm9rZW4gU1NMIGNvbW11bmljYXRpb24gZXhwb3NlcyB2YXVsdCBjb250ZW50cyB0byBuZXR3b3JrIGFkbWluaXN0cmF0b3JzIFxuXG4gICAgICAgICAgICBJY29ucyAxLjIuMiBUcmFja2luZyBvZiB1c2VyIHZhdWx0IGNvbnRlbnRzIGJ5IGlwIGNvcnJlbGF0aW9uIGJldHdlZW4gaWRlbnRpdHkgYW5kIGljb25zIHNlcnZpY2VzIFxuXG4gICAgICAgICAgICBJY29ucyAxLjIuMyBObyBTTEEgb2ZmZXJlZCBvbiBJY29ucyBzZXJ2aWNlLCBncmFjZWZ1bCBkZWdyYWRhdGlvbiBvZiBmZWF0dXJlcyBuZWVkZWQgaWYgaXQgZ29lcyBkb3duIFxuXG4gICAgICAgICAgICBJY29ucyAxLjIuNCBTU1JGIHRocm91Z2ggY3JhZnRlZCBpbnB1dCByZXNvbHZpbmcgdG8gYSBsb2NhdGlvbiB0aGUgc2VydmVyIGhhcyBlbGV2YXRlZCBwcml2aWxlZ2VzIGluIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpY29uc19jb250cm9sbGVyIC0+IGljb25fZGV0ZXJtaW5hdGlvbiAiUmVxdWVzdHMgaWNvbnMgZnJvbSIKICAgICAgICBpY29uc19jb250cm9sbGVyIC0+IGljb25fY2FjaGUgIkNhY2hlcyBpY29ucyBpbiIgewogICAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICAgIlNlY3VyaXR5IiAiICAgICAgICAgICAgSWNvbnMgMS4zLjEgQWdncmVnYXRlIHZhdWx0IGNvbnRlbnQgbGVhayB0aHJvdWdoIHRpbWluZyBhdHRhY2sgb24gY2FjaGUgXG5cbiAgICAgICAgICAgIEljb25zIDEuMy4yIFBvc3NpYmxlIGluamVjdGlvbiBhdHRhY2sgdGhyb3VnaCBjYWNoZSBrZXkgXG5cbiAgICAgICAgICAgIEljb25zIDEuMy4zICYgSWNvbnMgMS4zLjQgQ2FjaGUgYmxvYXQgbGVhZGluZyB0byBEb1MgXG5cbiAgICAgICAgICAgIEljb25zIDEuMy41IENhY2hlIHBvaXNvbmluZyBsZWFkaW5nIHRvIGluY29ycmVjdCBpY29uIHN0b3JhZ2UgIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgCiAgICBkbnMgPSBzb2Z0d2FyZVN5c3RlbSAiRE5TIiB7CiAgICAgIHRhZ3MgIkV4dGVybmFsIgogICAgICB0YWdzICJJY29ucyIKICAgIH0KICAgIAogICAgc2VydmVyLmljb25zLmljb25fZGV0ZXJtaW5hdGlvbiAtPiBkbnMgIlJlc29sdmVzIElQIGFkZHJlc3NlcyBmb3IgZG9tYWluIG5hbWVzIGZyb20iCiAgICAKICAgIGV4dGVybmFsX3dlYnNpdGVzID0gc29mdHdhcmVTeXN0ZW0gIkV4dGVybmFsIFdlYnNpdGVzIiB7CiAgICAgIHRhZ3MgIkV4dGVybmFsIgogICAgICB0YWdzICJJY29ucyIKICAgIH0KICAgIAogICAgc2VydmVyLmljb25zLmljb25fZGV0ZXJtaW5hdGlvbiAtPiBleHRlcm5hbF93ZWJzaXRlcyAiUmV0cmlldmVzIGljb25zIGZyb20iCgogICAgIyBJbmNsdWRlIHNoYXJlZCBsZXZlbCByZWxhdGlvbnNoaXBzCiAgICAjIFVzZXIgUmVsYXRpb25zaGlwcwogICAgdXNlciAtPiBjbGllbnRzLndlYiAiVXNlcyIKICAgIHVzZXIgLT4gY2xpZW50cy5pb3MgIlVzZXMiCiAgICB1c2VyIC0+IGNsaWVudHMuYW5kcm9pZCAiVXNlcyIKICAgIHVzZXIgLT4gY2xpZW50cy5icm93c2VyX2V4dGVuc2lvbiAiVXNlcyIKICAgIHVzZXIgLT4gY2xpZW50cy5jbGkgIlVzZXMiCiAgICB1c2VyIC0+IGNsaWVudHMuZGVza3RvcCAiVXNlcyIKICAgIGFkbWluIC0+IGNsaWVudHMud2ViICJBZG1pbmlzdGVycyBPcmdhbml6YXRpb25zIgogICAgcHJvdmlkZXIgLT4gc2VydmVyLnBvcnRhbCAiQ29tcGxldGVzIFByb3ZpZGVyIHJlZ2lzdHJhdGlvbiB3aXRoIgogICAgcHJvdmlkZXIgLT4gY2xpZW50cy53ZWIgIkFkbWluaXN0ZXJzIFByb3ZpZGVycyBhbmQgT3JnYW5pemF0aW9ucyIKICAgIGN1c3RvbWVyX3N1Y2Nlc3MgLT4gc2VydmVyLnBvcnRhbCAiSW5zcGVjdHMgYW5kIHN1cHBvcnRzIgogICAgc3lzdGVtX2FkbWluIC0+IHNlcnZlci5wb3J0YWwgIkFkbWluaXN0ZXJzIFN5c3RlbSIKICAgIAogICAgIyBIaWdoLWxldmVsIENsaWVudCBSZWxhdGlvbnNoaXBzCiAgICBjbGllbnRzLndlYiAtPiBzZXJ2ZXIuYXBpICJNYWtlcyByZXF1ZXN0cyB0byIKICAgIGNsaWVudHMuaW9zIC0+IHNlcnZlci5hcGkgIk1ha2VzIHJlcXVlc3RzIHRvIgogICAgY2xpZW50cy5hbmRyb2lkIC0+IHNlcnZlci5hcGkgIk1ha2VzIHJlcXVlc3RzIHRvIgogICAgY2xpZW50cy5icm93c2VyX2V4dGVuc2lvbiAtPiBzZXJ2ZXIuYXBpICJNYWtlcyByZXF1ZXN0cyB0byIKICAgIGNsaWVudHMuY2xpIC0+IHNlcnZlci5hcGkgIk1ha2VzIHJlcXVlc3RzIHRvIgogICAgY2xpZW50cy5kZXNrdG9wIC0+IHNlcnZlci5hcGkgIk1ha2VzIHJlcXVlc3RzIHRvIgogICAgY2xpZW50cy53ZWIgLT4gc2VydmVyLmlkZW50aXR5ICJBdXRoZW50aWNhdGVzIHdpdGgiCiAgICBjbGllbnRzLmlvcyAtPiBzZXJ2ZXIuaWRlbnRpdHkgIkF1dGhlbnRpY2F0ZXMgV2l0aCIKICAgIGNsaWVudHMuYW5kcm9pZCAtPiBzZXJ2ZXIuaWRlbnRpdHkgIkF1dGhlbnRpY2F0ZXMgV2l0aCIKICAgIGNsaWVudHMuYnJvd3Nlcl9leHRlbnNpb24gLT4gc2VydmVyLmlkZW50aXR5ICJBdXRoZW50aWNhdGVzIFdpdGgiCiAgICBjbGllbnRzLmNsaSAtPiBzZXJ2ZXIuaWRlbnRpdHkgIkF1dGhlbnRpY2F0ZXMgV2l0aCIKICAgIGNsaWVudHMuZGVza3RvcCAtPiBzZXJ2ZXIuaWRlbnRpdHkgIkF1dGhlbnRpY2F0ZXMgV2l0aCIKICAgIHNlcnZlci5hcGkgLT4gc2VydmVyLmlkZW50aXR5ICJWYWxpZGF0ZXMgSldUcyB3aXRoIiB7CiAgICAgIHVybCAiaHR0cHM6Ly9iaXR3YXJkZW4uY29tIgogICAgfQogICAgY2xpZW50cyAtPiBzZXJ2ZXIuZXZlbnRzICJQb3N0cyBsb2NhbCB1c2FnZSBldmVudHMgdG8iCiAgICAKICAgICMgRGF0YWJhc2UgUmVsYXRpb25zaGlwcwogICAgCiAgICBzZXJ2ZXIuYXBpIC0+IHNlcnZlci5kYXRhYmFzZSAiUXVlcmllcyIKICAgIHNlcnZlci5wb3J0YWwgLT4gc2VydmVyLmRhdGFiYXNlICJRdWVyaWVzIgogICAgCiAgICAjIHF1ZXVlIFJlbGF0aW9uc2hpcHMKICAgIHNlcnZlci5hcGkgLT4gc2VydmVyLmV2ZW50c19xdWV1ZSAiU2VuZHMgZXZlbnRzIHRvIgogICAgc2VydmVyLmV2ZW50cyAtPiBzZXJ2ZXIuZXZlbnRzX3F1ZXVlICJTZW5kcyBldmVudHMgdG8iCiAgICBzZXJ2ZXIuYXBpIC0+IHNlcnZlci5tYWlsX3F1ZXVlICJTZW5kcyBlbWFpbHMgdG8iCiAgICBzZXJ2ZXIuYXBpIC0+IHNlcnZlci5ub3RpZmljYXRpb25zX3F1ZXVlICJTZW5kcyBub3RpZmljYXRpb25zIHRvIgogICAgc2VydmVyLm5vdGlmaWNhdGlvbnMgLT4gc2VydmVyLm5vdGlmaWNhdGlvbnNfcXVldWUgIlNlbmRzIG5vdGlmaWNhdGlvbnMgdG8iCiAgICBzZXJ2ZXIuZXZlbnRzX3F1ZXVlIC0+IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yICJQcm9jZXNzZXMgZXZlbnRzIGZyb20iCiAgICBzZXJ2ZXIubWFpbF9xdWV1ZSAtPiBzZXJ2ZXIucG9ydGFsICJQcm9jZXNzZXMgZW1haWxzIGZyb20iCiAgICAKICAgICMgc2VsZiBob3N0IHBob25lIGhvbWUKICAgIHNlbGZfaG9zdGVkX2luc3RhbmNlcyAtPiBzZXJ2ZXIubm90aWZpY2F0aW9ucyAiU2VuZHMgcHVzaCBub3RpZmljYXRpb24gcHJveHkgcmVxdWVzdHMgdG8iCgoKICAgIHNlcnZlci5zY2ltIC0+IHNlcnZlci5kYXRhYmFzZSAiUXVlcmllcyIKICAgIHNlcnZlci5pZGVudGl0eSAtPiBzZXJ2ZXIuZGF0YWJhc2UgIlF1ZXJpZXMiCiAgICBzZXJ2ZXIuc3NvIC0+IHNlcnZlci5kYXRhYmFzZSAiUXVlcmllcyIKICAgICMgSGlnaC1sZXZlbCBwcm92aWRlciByZWxhdGlvbnNoaXBzCiAgICBzZXJ2ZXIuYXBpLmJpbGxpbmcgLT4gc3RyaXBlICJSZXF1ZXN0cyBwYXltZW50cyBmb3IgY3VzdG9tZXJzIgogICAgc2VydmVyLmFwaS5iaWxsaW5nIC0+IGJyYWludHJlZSAiUmVxdWVzdHMgcGF5bWVudHMgZm9yIGN1c3RvbWVycyIKICAgIHN0cmlwZSAtPiBzZXJ2ZXIuYXBpLmJpbGxpbmcgIlNlbmRzIHN1YnNjcmlwdGlvbiBldmVudHMgdG8iCiAgICBrZXlfY29ubmVjdG9yIC0+IHNlcnZlci5pZGVudGl0eSAiVmFsaWRhdGVzIEpXVHMgd2l0aCIKICB9CgogIHZpZXdzIHsKICAgIHN0eWxlcyB7CiAgICAgIGVsZW1lbnQgIlBlcnNvbiIgewogICAgICAgIGJhY2tncm91bmQgIzMxMDdkMwogICAgICAgIHNoYXBlIHBlcnNvbgogICAgICB9CiAgICAgIGVsZW1lbnQgIk1TUCIgewogICAgICAgIGJhY2tncm91bmQgIzMxMDdkMwogICAgICAgIHNoYXBlIHBlcnNvbgogICAgICB9CiAgICB9CiAgICBjb21wb25lbnQgc2VydmVyLmljb25zICJpY29uc19zZXJ2aWNlIiB7CiAgICAgIGluY2x1ZGUgKgogICAgfQoKICAgIHN5c3RlbUxhbmRzY2FwZSAiQml0d2FyZGVuIiB7CiAgICAgIGluY2x1ZGUgKgogICAgfQoKICAgIGNvbnRhaW5lciBzZXJ2ZXIgIkJpdHdhcmRlbl9TZXJ2ZXIiIHsKICAgICAgaW5jbHVkZSAqCiAgICB9CgogICAgLy8gVGhpcyBpcyBsYXN0IHRvIG92ZXJyaWRlIHRlYW0gc3R5bGVzIHdpdGggY29tbW9uIHN0eWxlcwogICAgc3R5bGVzIHsKICAgICAgdGhlbWUgZGVmYXVsdAogICAgICBlbGVtZW50ICJFbGVtZW50IiB7CiAgICAgICAgY29sb3IgIzNjM2IzYgogICAgICB9CiAgICAgIGVsZW1lbnQgIlBlcnNvbiIgewogICAgICAgIGJhY2tncm91bmQgI2QzNDQwNwogICAgICAgIHNoYXBlIHBlcnNvbgogICAgICB9CiAgICAgIGVsZW1lbnQgIkNvbnRhaW5lciIgewogICAgICAgIGJhY2tncm91bmQgI2Y4ODcyOAogICAgICB9CiAgICAgIGVsZW1lbnQgIk1TUCIgewogICAgICAgIGJhY2tncm91bmQgIzMxMDdkMwogICAgICB9CiAgICAgIGVsZW1lbnQgIlF1ZXVlIiB7CiAgICAgICAgc2hhcGUgcGlwZQogICAgICB9CiAgICAgIGVsZW1lbnQgIk1vYmlsZSIgewogICAgICAgIHNoYXBlIG1vYmlsZURldmljZVBvcnRyYWl0CiAgICAgIH0KICAgICAgZWxlbWVudCAiV2ViIiB7CiAgICAgICAgc2hhcGUgd2ViQnJvd3NlcgogICAgICB9CiAgICAgIGVsZW1lbnQgIkRhdGFiYXNlIiB7CiAgICAgICAgc2hhcGUgY3lsaW5kZXIKICAgICAgfQogICAgICBlbGVtZW50ICJFeHRlcm5hbCIgewogICAgICAgIGNvbG9yICMwMDAwMDAKICAgICAgICBiYWNrZ3JvdW5kICNiNWI1YjUKICAgICAgfQogICAgfQogIH0KfQ==" + "structurizr.dsl" : "d29ya3NwYWNlICJCaXR3YXJkZW4gU2VydmVyIFN5c3RlbSIgewoKICAhaWRlbnRpZmllcnMgaGllcmFyY2hpY2FsCgogICFkb2NzICJ1c2FnZV9kb2NzIgogIG1vZGVsIHsKICAgIHByb3BlcnRpZXMgewogICAgICAic3RydWN0dXJpenIuZ3JvdXBTZXBhcmF0b3IiICIvIgogICAgfQoKICAgICMgSW5jbHVkZSBzaGFyZWQgbGV2ZWwgbW9kZWxzCiAgICAjIFBlcnNvbiB0eXBlcwogICAgdXNlciA9IHBlcnNvbiAiQml0d2FyZGVuIFVzZXIiICJBbiBlbmQgdXNlciBvZiB0aGUgQml0d2FyZGVuIFN5c3RlbSIKICAgIHN5c3RlbV9hZG1pbiA9IHBlcnNvbiAiU3lzdGVtIEFkbWluIiAiRWl0aGVyIGEgQml0d2FyZGVuIHNpdGUtcmVsaWFiaWxpdHkgZW5naW5lZXIgb3IgYWRtaW5pc3RyYXRvciBvZiBhIHNlbGYtaG9zdGVkIGluc3RhbmNlIiB7CiAgICAgIHRhZ3MgIkJpdHdhcmRlbiBFbXBsb3llZSIgIlNlbGYtSG9zdCBBZG1pbiIKICAgIH0KICAgIAogICAgCiAgICBid19jb250cm9sbGVkID0gZ3JvdXAgIkJpdHdhcmRlbiBDb250cm9sbGVkIiB7CiAgICAgICMgQml0d2FyZGVuIHN0YWZmCiAgICAgIGN1c3RvbWVyX3N1Y2Nlc3MgPSBwZXJzb24gIkN1c3RvbWVyIFN1Y2Nlc3MiICJBIGN1c3RvbWVyIHN1Y2Nlc3MgZW5naW5lZXIuIEluc3BlY3RzIGJpdHdhcmRlbiBzdGF0ZSB0aHJvdWdoIHRoZSBhZG1pbiBwb3J0YWwgYW5kIGludGVybmFsIHRvb2xzIiB7CiAgICAgICAgdGFncyAiQml0d2FyZGVuIEVtcGxveWVlIgogICAgICB9CiAgICAgICMgUm9vdCBzeXN0ZW1zCiAgICAgIHNlcnZlciA9IHNvZnR3YXJlU3lzdGVtICJCaXR3YXJkZW4gU2VydmVyIiB7CiAgICAgICAgYXBpID0gY29udGFpbmVyICJBUEkiIHsKICAgICAgICAgIGJpbGxpbmcgPSBjb21wb25lbnQgIkJpbGxpbmciIHsKICAgICAgICAgICAgdGFncyAiQmlsbGluZyIKICAgICAgICAgIH0KICAgICAgICAgIHRhZ3MgIkFQSSIKICAgICAgICB9CiAgICAgICAgZXZlbnRzID0gY29udGFpbmVyICJFdmVudHMiIHsKICAgICAgICAgIHRhZ3MgIkV2ZW50cyIKICAgICAgICB9CiAgICAgICAgbm90aWZpY2F0aW9ucyA9IGNvbnRhaW5lciAiTm90aWZpY2F0aW9ucyIKICAgICAgICBwb3J0YWwgPSBjb250YWluZXIgIkJpdHdhcmRlbiBQb3J0YWwiIHsKICAgICAgICAgIHRhZ3MgIldlYiIKICAgICAgICB9CiAgICAgICAgZXZlbnRzX3Byb2Nlc3NvciA9IGNvbnRhaW5lciAiRXZlbnRzIFByb2Nlc3NvciIgewogICAgICAgICAgdGFncyAiRXZlbnRzIgogICAgICAgICAgdGFncyAiQ2xvdWQtT25seSIKICAgICAgICB9CiAgICAKICAgICAgICAjIERhdGEgc3RvcmVzCiAgICAgICAgZGF0YWJhc2UgPSBjb250YWluZXIgIkRhdGFiYXNlIiB7CiAgICAgICAgICB0YWdzICJEYXRhYmFzZSIKICAgICAgICB9CiAgICAgICAgbWFpbF9xdWV1ZSA9IGNvbnRhaW5lciAiTWFpbCBRdWV1ZSIgewogICAgICAgICAgdGFncyAiUXVldWUiCiAgICAgICAgICB0YWdzICJBenVyZSIKICAgICAgICB9CiAgICAgICAgbm90aWZpY2F0aW9uc19xdWV1ZSA9IGNvbnRhaW5lciAiTm90aWZpY2F0aW9ucyBRdWV1ZSIgewogICAgICAgICAgdGFncyAiUXVldWUiCiAgICAgICAgICB0YWdzICJBenVyZSIKICAgICAgICB9CiAgICAgIH0KICAgICAgY2xpZW50cyA9IHNvZnR3YXJlU3lzdGVtICJDbGllbnRzIiB7CiAgICAgICAgd2ViID0gY29udGFpbmVyICJXZWIgQXBwbGljYXRpb24iIHsKICAgICAgICAgIHRhZ3MgIldlYiIKICAgICAgICB9CiAgICAgICAgaW9zID0gY29udGFpbmVyICJpT1MgQXBwbGljYXRpb24iIHsKICAgICAgICAgIHRhZ3MgIk1vYmlsZSIKICAgICAgICB9CiAgICAgICAgYW5kcm9pZCA9IGNvbnRhaW5lciAiQW5kcm9pZCBBcHBsaWNhdGlvbiIgewogICAgICAgICAgdGFncyAiTW9iaWxlIgogICAgICAgIH0KICAgICAgICBicm93c2VyX2V4dGVuc2lvbiA9IGNvbnRhaW5lciAiQnJvd3NlciBFeHRlbnNpb24iIHsKICAgICAgICAgIHRhZ3MgIkJyb3dzZXIiCiAgICAgICAgfQogICAgICAgIGNsaSA9IGNvbnRhaW5lciAiQ0xJIiB7CiAgICAgICAgICB0YWdzICJDTEkiCiAgICAgICAgfQogICAgICAgIGRlc2t0b3AgPSBjb250YWluZXIgIkRlc2t0b3AgQXBwbGljYXRpb24iIHsKICAgICAgICAgIHRhZ3MgIkRlc2t0b3AiCiAgICAgICAgfQogICAgICB9CiAgICAgIGRpcmVjdG9yeV9jb25uZWN0b3IgPSBzb2Z0d2FyZVN5c3RlbSAiRGlyZWN0b3J5IENvbm5lY3RvciIgewogICAgICAgIHRhZ3MgIkRpcmVjdG9yeSIKICAgICAgICB0YWdzICJMREFQIgogICAgICAgIHRhZ3MgIlNlbGYtSG9zdGVkIgogICAgICB9CiAgICAgIGtleV9jb25uZWN0b3IgPSBzb2Z0d2FyZVN5c3RlbSAiS2V5IENvbm5lY3RvciIKICAgIH0KICAgIAogICAgc2VsZl9ob3N0ZWRfaW5zdGFuY2VzID0gc29mdHdhcmVTeXN0ZW0gIlNlbGYtSG9zdGVkIEluc3RhbmNlcyIgewogICAgICB0YWdzICJTZWxmLUhvc3RlZCIKICAgICAgdGFncyAiRXh0ZXJuYWwiCiAgICAgIGRlc2NyaXB0aW9uICJTZWxmLWhvc3RlZCBpbnN0YW5jZXMgb2YgQml0d2FyZGVuIHNlcnZlcnMiCiAgICB9CgogICAgIyBJbmNsdWRlIHRlYW0gbGV2ZWwgbW9kZWxzCiAgICBhZG1pbiA9IHBlcnNvbiAiT3JnYW5pemF0aW9uIEFkbWluIiAiQW4gYWRtaW5pc3RyYXRvciBvZiBhbiBvcmdhbml6YXRpb24iIHsKICAgICAgdGFncyAiQWRtaW4iCiAgICB9CiAgICBwcm92aWRlciA9IHBlcnNvbiAiTVNQIiAiQW5kIGVtcGxveWVlIG9mIGEgbWFuYWdlZCBzZXJ2aWNlIHByb3ZpZGVyIiB7CiAgICAgIHRhZ3MgIk1TUCIKICAgIH0KICAgIAogICAgIWVsZW1lbnQgc2VydmVyIHsKICAgICAgc2NpbSA9IGNvbnRhaW5lciAiU0NJTSIgewogICAgICAgIHRhZ3MgIlNDSU0iCiAgICAgIH0KICAgIH0KICAgIAogICAgZGlyZWN0b3J5X2Nvbm5lY3RvciAtPiBzZXJ2ZXIuYXBpICJTeW5jcyB1c2VycyBhbmQgZ3JvdXBzIHRvIEJpdHdhcmRlbiIKICAgICFlbGVtZW50IHNlcnZlciB7CiAgICAgIGlkZW50aXR5ID0gY29udGFpbmVyICJJZGVudGl0eSIgewogICAgICAgIHRhZ3MgIkF1dGgiCiAgICAgIH0KICAgICAgc3NvID0gY29udGFpbmVyICJTU08iIHsKICAgICAgICB0YWdzICJBdXRoIgogICAgICB9CiAgICB9CiAgICAjIEV4dGVybmFsIHZlbmRvcnMKICAgIGdyb3VwICJQYXltZW50IFN5c3RlbXMiIHsKICAgICAgc3RyaXBlID0gc29mdHdhcmVTeXN0ZW0gIlN0cmlwZSIgewogICAgICAgIHRhZ3MgIkV4dGVybmFsIgogICAgICAgIHRhZ3MgIkJpbGxpbmciCiAgICAgICAgZGVzY3JpcHRpb24gIkhhbmRsZXMgY3JlZGl0IGNhcmRzIGFuZCBzdWJzY3JpcHRpb25zLiIKICAgICAgfQogICAgICBicmFpbnRyZWUgPSBzb2Z0d2FyZVN5c3RlbSAiQnJhaW50cmVlIiB7CiAgICAgICAgdGFncyAiRXh0ZXJuYWwiCiAgICAgICAgdGFncyAiQmlsbGluZyIKICAgICAgICBkZXNjcmlwdGlvbiAiSGFuZGxlcyBQYXlQYWwgYW5kIGNyeXB0b2N1cnJlbmN5LiIKICAgICAgfQogICAgfQogICAgCiAgICAhZWxlbWVudCBzZXJ2ZXIgewogICAgICAgIGF6dXJlX3NlcnZpY2VfYnVzID0gY29udGFpbmVyICJBenVyZSBTZXJ2aWNlIEJ1cyIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiQU1RUCBzZXJ2aWNlIHVzZWQgZm9yIHB1Yi9zdWIgYXJjaGl0ZWN0dXJlIGZvciBFdmVudHMgYW5kIEludGVncmF0aW9ucyIKICAgICAgICAgICAgdGFncyAiRXZlbnRzIiwgIkF6dXJlIiwgIkFTQiIsICJDbG91ZC1Pbmx5IgogICAgCiAgICAgICAgICAgIGV2ZW50X3RvcGljID0gY29tcG9uZW50ICJFdmVudCBUb3BpYyIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBhbGwgZXZlbnRzIGluIHRoZSBzeXN0ZW0uIFdoZW4gYW4gZXZlbnQgb2NjdXJzLCBpdCBpcyBwdWJsaXNoZWQgdG8gdGhpcyB0b3BpYy4iCiAgICAgICAgICAgICAgICB0YWdzICJFdmVudHMiLCAiQVNCIiwgIkV2ZW50IFRpZXIiCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBpbnRlZ3JhdGlvbl90b3BpYyA9IGNvbXBvbmVudCAiSW50ZWdyYXRpb24gVG9waWMiIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJFdmVudHMgdGhhdCBoYXZlIGludGVncmF0aW9ucyBjb25maWd1cmVkIGFyZSBwcm9jZXNzZWQgYW5kIHB1dCBvbiB0aGUgaW50ZWdyYXRpb24gdG9waWMgd2l0aCBhIHJvdXRpbmcga2V5IGZvciB0aGVpciBzcGVjaWZpYyBpbnRlZ3JhdGlvbiBoYW5kbGVyIHRvIHByb2Nlc3MuIgogICAgICAgICAgICAgICAgdGFncyAiRXZlbnRzIiwgIkFTQiIsICJJbnRlZ3JhdGlvbnMiLCAiSW50ZWdyYXRpb24gVGllciIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGV2ZW50c1dyaXRlU3ViID0gY29tcG9uZW50ICJldmVudHMtd3JpdGUtc3Vic2NyaXB0aW9uIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3Vic2NyaXB0aW9uIGZvciBFdmVudFJlcG9zaXRvcnlIYW5kbGVyIHRvIHdyaXRlIGFsbCBldmVudHMgaW50byBhenVyZSB0YWJsZSBzdG9yYWdlLiIKICAgICAgICAgICAgICAgIHRhZ3MgIkFTQiIsICJTdWJzY3JpcHRpb24iLCAiRXZlbnQgVGllciIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGV2ZW50c1NsYWNrU3ViID0gY29tcG9uZW50ICJldmVudHMtc2xhY2stc3Vic2NyaXB0aW9uIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3Vic2NyaXB0aW9uIGZvciBzbGFjay1zcGVjaWZpYyBFdmVudEludGVncmF0aW9uSGFuZGxlciB3aGljaCBwdWJsaXNoZXMgcHJvY2Vzc2VkIGV2ZW50cyB0byB0aGUgaW50ZWdyYXRpb24gdGllciBpZiB0aGVyZSBpcyBhIFNsYWNrIGludGVncmF0aW9uIGNvbmZpZ3VyZWQuIgogICAgICAgICAgICAgICAgdGFncyAiQVNCIiwgIlN1YnNjcmlwdGlvbiIsICJFdmVudCBUaWVyIiwgIlNsYWNrIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgZXZlbnRzV2ViaG9va1N1YiA9IGNvbXBvbmVudCAiZXZlbnRzLXdlYmhvb2stc3Vic2NyaXB0aW9uIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3Vic2NyaXB0aW9uIGZvciB3ZWJob29rLXNwZWNpZmljIEV2ZW50SW50ZWdyYXRpb25IYW5kbGVyIHdoaWNoIHB1Ymxpc2hlcyBwcm9jZXNzZWQgZXZlbnRzIHRvIHRoZSBpbnRlZ3JhdGlvbiB0aWVyIGlmIHRoZXJlIGlzIGEgd2ViaG9vayBpbnRlZ3JhdGlvbiBjb25maWd1cmVkLiIKICAgICAgICAgICAgICAgIHRhZ3MgIkFTQiIsICJTdWJzY3JpcHRpb24iLCAiRXZlbnQgVGllciIsICJXZWJob29rIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgZXZlbnRzSGVjU3ViID0gY29tcG9uZW50ICJldmVudHMtaGVjLXN1YnNjcmlwdGlvbiIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlN1YnNjcmlwdGlvbiBmb3IgSEVDLXNwZWNpZmljIEV2ZW50SW50ZWdyYXRpb25IYW5kbGVyIHdoaWNoIHB1Ymxpc2hlcyBwcm9jZXNzZWQgZXZlbnRzIHRvIHRoZSBpbnRlZ3JhdGlvbiB0aWVyIGlmIHRoZXJlIGlzIGEgSEVDIGludGVncmF0aW9uIGNvbmZpZ3VyZWQuIgogICAgICAgICAgICAgICAgdGFncyAiQVNCIiwgIlN1YnNjcmlwdGlvbiIsICJFdmVudCBUaWVyIiwgIkhFQyIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGV2ZW50c0RhdGFkb2dTdWIgPSBjb21wb25lbnQgImV2ZW50cy1kYXRhZG9nLXN1YnNjcmlwdGlvbiIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlN1YnNjcmlwdGlvbiBmb3IgRGF0YWRvZy1zcGVjaWZpYyBFdmVudEludGVncmF0aW9uSGFuZGxlciB3aGljaCBwdWJsaXNoZXMgcHJvY2Vzc2VkIGV2ZW50cyB0byB0aGUgaW50ZWdyYXRpb24gdGllciBpZiB0aGVyZSBpcyBhIERhdGFkb2cgaW50ZWdyYXRpb24gY29uZmlndXJlZC4iCiAgICAgICAgICAgICAgICB0YWdzICJBU0IiLCAiU3Vic2NyaXB0aW9uIiwgIkV2ZW50IFRpZXIiLCAiRGF0YWRvZyIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGV2ZW50c1RlYW1zU3ViID0gY29tcG9uZW50ICJldmVudHMtdGVhbXMtc3Vic2NyaXB0aW9uIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3Vic2NyaXB0aW9uIGZvciBNaWNyb3NvZnQgVGVhbXMtc3BlY2lmaWMgRXZlbnRJbnRlZ3JhdGlvbkhhbmRsZXIgd2hpY2ggcHVibGlzaGVzIHByb2Nlc3NlZCBldmVudHMgdG8gdGhlIGludGVncmF0aW9uIHRpZXIgaWYgdGhlcmUgaXMgYSBUZWFtcyBpbnRlZ3JhdGlvbiBjb25maWd1cmVkLiIKICAgICAgICAgICAgICAgIHRhZ3MgIkFTQiIsICJTdWJzY3JpcHRpb24iLCAiRXZlbnQgVGllciIsICJUZWFtcyIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGludGVncmF0aW9uU2xhY2tTdWIgPSBjb21wb25lbnQgImludGVncmF0aW9uLXNsYWNrLXN1YnNjcmlwdGlvbiIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkludGVncmF0aW9uLWxldmVsIHN1YnNjcmlwdGlvbiBmb3IgU2xhY2sgSW50ZWdyYXRpb25NZXNzYWdlcy4gQ29ycmVsYXRpb24gZmlsdGVyOiBMYWJlbCA9ICdzbGFjaycuIgogICAgICAgICAgICAgICAgdGFncyAiQVNCIiwgIlN1YnNjcmlwdGlvbiIsICJJbnRlZ3JhdGlvbiBUaWVyIiwgIlNsYWNrIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgaW50ZWdyYXRpb25XZWJob29rU3ViID0gY29tcG9uZW50ICJpbnRlZ3JhdGlvbi13ZWJob29rLXN1YnNjcmlwdGlvbiIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkludGVncmF0aW9uLWxldmVsIHN1YnNjcmlwdGlvbiBmb3IgV2ViaG9vayBJbnRlZ3JhdGlvbk1lc3NhZ2VzLiBDb3JyZWxhdGlvbiBmaWx0ZXI6IExhYmVsID0gJ3dlYmhvb2snLiIKICAgICAgICAgICAgICAgIHRhZ3MgIkFTQiIsICJTdWJzY3JpcHRpb24iLCAiSW50ZWdyYXRpb24gVGllciIsICJXZWJob29rIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgaW50ZWdyYXRpb25IZWNTdWIgPSBjb21wb25lbnQgImludGVncmF0aW9uLWhlYy1zdWJzY3JpcHRpb24iIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbnRlZ3JhdGlvbi1sZXZlbCBzdWJzY3JpcHRpb24gZm9yIEhFQyBJbnRlZ3JhdGlvbk1lc3NhZ2VzLiBDb3JyZWxhdGlvbiBmaWx0ZXI6IExhYmVsID0gJ2hlYycuIgogICAgICAgICAgICAgICAgdGFncyAiQVNCIiwgIlN1YnNjcmlwdGlvbiIsICJJbnRlZ3JhdGlvbiBUaWVyIiwgIkhFQyIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGludGVncmF0aW9uRGF0YWRvZ1N1YiA9IGNvbXBvbmVudCAiaW50ZWdyYXRpb24tZGF0YWRvZy1zdWJzY3JpcHRpb24iIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbnRlZ3JhdGlvbi1sZXZlbCBzdWJzY3JpcHRpb24gZm9yIERhdGFkb2cgSW50ZWdyYXRpb25NZXNzYWdlcy4gQ29ycmVsYXRpb24gZmlsdGVyOiBMYWJlbCA9ICdkYXRhZG9nJy4iCiAgICAgICAgICAgICAgICB0YWdzICJBU0IiLCAiU3Vic2NyaXB0aW9uIiwgIkludGVncmF0aW9uIFRpZXIiLCAiRGF0YWRvZyIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGludGVncmF0aW9uVGVhbXNTdWIgPSBjb21wb25lbnQgImludGVncmF0aW9uLXRlYW1zLXN1YnNjcmlwdGlvbiIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkludGVncmF0aW9uLWxldmVsIHN1YnNjcmlwdGlvbiBmb3IgTWlvY3Jvc29mdCBUZWFtcyBJbnRlZ3JhdGlvbk1lc3NhZ2VzLiBDb3JyZWxhdGlvbiBmaWx0ZXI6IExhYmVsID0gJ3RlYW1zJy4iCiAgICAgICAgICAgICAgICB0YWdzICJBU0IiLCAiU3Vic2NyaXB0aW9uIiwgIkludGVncmF0aW9uIFRpZXIiLCAiVGVhbXMiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICByYWJiaXRfbXEgPSBjb250YWluZXIgIlJhYmJpdE1RIiB7CiAgICAgICAgICAgIHRhZ3MgIkV2ZW50cyIKICAgICAgICAgICAgdGFncyAiUmFiYml0TVEiCiAgICAgICAgICAgIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICAKICAgICAgICAgICAgZXZlbnRfZXhjaGFuZ2UgPSBjb21wb25lbnQgIkV2ZW50IEV4Y2hhbmdlIiB7CiAgICAgICAgICAgICAgICB0YWdzICJFdmVudHMiLCAiRXZlbnQgVGllciIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGludGVncmF0aW9uX2V4Y2hhbmdlID0gY29tcG9uZW50ICJJbnRlZ3JhdGlvbiBFeGNoYW5nZSIgewogICAgICAgICAgICAgICAgdGFncyAiRXZlbnRzIiwgIkludGVncmF0aW9ucyIsICJJbnRlZ3JhdGlvbiBUaWVyIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgZXZlbnRzV3JpdGVRdWV1ZSA9IGNvbXBvbmVudCAiZXZlbnRzLXdyaXRlLXF1ZXVlIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUXVldWUgZm9yIEV2ZW50UmVwb3NpdG9yeUhhbmRsZXIgdG8gd3JpdGUgYWxsIGV2ZW50cyBpbnRvIHRoZSBkYXRhYmFzZS4iCiAgICAgICAgICAgICAgICB0YWdzICJSYWJiaXRNUSIsICJRdWV1ZSIsICJFdmVudCBUaWVyIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgZXZlbnRzU2xhY2tRdWV1ZSA9IGNvbXBvbmVudCAiZXZlbnRzLXNsYWNrLXF1ZXVlIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUXVldWUgZm9yIHNsYWNrLXNwZWNpZmljIEV2ZW50SW50ZWdyYXRpb25IYW5kbGVyIHdoaWNoIHB1Ymxpc2hlcyBwcm9jZXNzZWQgZXZlbnRzIHRvIHRoZSBpbnRlZ3JhdGlvbiB0aWVyIGlmIHRoZXJlIGlzIGEgU2xhY2sgaW50ZWdyYXRpb24gY29uZmlndXJlZC4iCiAgICAgICAgICAgICAgICB0YWdzICJSYWJiaXRNUSIsICJRdWV1ZSIsICJFdmVudCBUaWVyIiwgIlNsYWNrIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgZXZlbnRzV2ViaG9va1F1ZXVlID0gY29tcG9uZW50ICJldmVudHMtd2ViaG9vay1xdWV1ZSIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlF1ZXVlIGZvciB3ZWJob29rLXNwZWNpZmljIEV2ZW50SW50ZWdyYXRpb25IYW5kbGVyIHdoaWNoIHB1Ymxpc2hlcyBwcm9jZXNzZWQgZXZlbnRzIHRvIHRoZSBpbnRlZ3JhdGlvbiB0aWVyIGlmIHRoZXJlIGlzIGEgd2ViaG9vayBpbnRlZ3JhdGlvbiBjb25maWd1cmVkLiIKICAgICAgICAgICAgICAgIHRhZ3MgIlJhYmJpdE1RIiwgIlF1ZXVlIiwgIkV2ZW50IFRpZXIiLCAiV2ViaG9vayIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGV2ZW50c0hlY1F1ZXVlID0gY29tcG9uZW50ICJldmVudHMtaGVjLXF1ZXVlIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUXVldWUgZm9yIEhFQy1zcGVjaWZpYyBFdmVudEludGVncmF0aW9uSGFuZGxlciB3aGljaCBwdWJsaXNoZXMgcHJvY2Vzc2VkIGV2ZW50cyB0byB0aGUgaW50ZWdyYXRpb24gdGllciBpZiB0aGVyZSBpcyBhIEhFQyBpbnRlZ3JhdGlvbiBjb25maWd1cmVkLiIKICAgICAgICAgICAgICAgIHRhZ3MgIlJhYmJpdE1RIiwgIlF1ZXVlIiwgIkV2ZW50IFRpZXIiLCAiSEVDIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgZXZlbnRzRGF0YWRvZ1F1ZXVlID0gY29tcG9uZW50ICJldmVudHMtZGF0YWRvZy1xdWV1ZSIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlF1ZXVlIGZvciBEYXRhZG9nLXNwZWNpZmljIEV2ZW50SW50ZWdyYXRpb25IYW5kbGVyIHdoaWNoIHB1Ymxpc2hlcyBwcm9jZXNzZWQgZXZlbnRzIHRvIHRoZSBpbnRlZ3JhdGlvbiB0aWVyIGlmIHRoZXJlIGlzIGEgRGF0YWRvZyBpbnRlZ3JhdGlvbiBjb25maWd1cmVkLiIKICAgICAgICAgICAgICAgIHRhZ3MgIlJhYmJpdE1RIiwgIlF1ZXVlIiwgIkV2ZW50IFRpZXIiLCAiRGF0YWRvZyIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGV2ZW50c1RlYW1zUXVldWUgPSBjb21wb25lbnQgImV2ZW50cy10ZWFtcy1xdWV1ZSIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlF1ZXVlIGZvciBNaWNyb3NvZnQgVGVhbXMtc3BlY2lmaWMgRXZlbnRJbnRlZ3JhdGlvbkhhbmRsZXIgd2hpY2ggcHVibGlzaGVzIHByb2Nlc3NlZCBldmVudHMgdG8gdGhlIGludGVncmF0aW9uIHRpZXIgaWYgdGhlcmUgaXMgYSBUZWFtcyBpbnRlZ3JhdGlvbiBjb25maWd1cmVkLiIKICAgICAgICAgICAgICAgIHRhZ3MgIlJhYmJpdE1RIiwgIlF1ZXVlIiwgIkV2ZW50IFRpZXIiLCAiVGVhbXMiCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBpbnRlZ3JhdGlvblNsYWNrUXVldWUgPSBjb21wb25lbnQgImludGVncmF0aW9uLXNsYWNrLXF1ZXVlIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW50ZWdyYXRpb24tbGV2ZWwgcXVldWUgZm9yIFNsYWNrIEludGVncmF0aW9uTWVzc2FnZXMuIFJvdXRpbmcga2V5ID0gJ3NsYWNrJy4iCiAgICAgICAgICAgICAgICB0YWdzICJSYWJiaXRNUSIsICJRdWV1ZSIsICJJbnRlZ3JhdGlvbiBUaWVyIiwgIlNsYWNrIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgaW50ZWdyYXRpb25XZWJob29rUXVldWUgPSBjb21wb25lbnQgImludGVncmF0aW9uLXdlYmhvb2stcXVldWUiIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbnRlZ3JhdGlvbi1sZXZlbCBxdWV1ZSBmb3IgV2ViaG9vayBJbnRlZ3JhdGlvbk1lc3NhZ2VzLiBSb3V0aW5nIGtleSA9ICd3ZWJob29rJy4iCiAgICAgICAgICAgICAgICB0YWdzICJSYWJiaXRNUSIsICJRdWV1ZSIsICJJbnRlZ3JhdGlvbiBUaWVyIiwgIldlYmhvb2siCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBpbnRlZ3JhdGlvbkhlY1F1ZXVlID0gY29tcG9uZW50ICJpbnRlZ3JhdGlvbi1oZWMtcXVldWUiIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbnRlZ3JhdGlvbi1sZXZlbCBxdWV1ZSBmb3IgSEVDIEludGVncmF0aW9uTWVzc2FnZXMuIFJvdXRpbmcga2V5ID0gJ2hlYycuIgogICAgICAgICAgICAgICAgdGFncyAiUmFiYml0TVEiLCAiUXVldWUiLCAiSW50ZWdyYXRpb24gVGllciIsICJIRUMiCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBpbnRlZ3JhdGlvbkRhdGFkb2dRdWV1ZSA9IGNvbXBvbmVudCAiaW50ZWdyYXRpb24tZGF0YWRvZy1xdWV1ZSIgewogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkludGVncmF0aW9uLWxldmVsIHF1ZXVlIGZvciBEYXRhZG9nIEludGVncmF0aW9uTWVzc2FnZXMuIFJvdXRpbmcga2V5ID0gJ2RhdGFkb2cnLiIKICAgICAgICAgICAgICAgIHRhZ3MgIlJhYmJpdE1RIiwgIlF1ZXVlIiwgIkludGVncmF0aW9uIFRpZXIiLCAiRGF0YWRvZyIKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGludGVncmF0aW9uVGVhbXNRdWV1ZSA9IGNvbXBvbmVudCAiaW50ZWdyYXRpb24tdGVhbXMtcXVldWUiIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbnRlZ3JhdGlvbi1sZXZlbCBxdWV1ZSBmb3IgVGVhbXMgSW50ZWdyYXRpb25NZXNzYWdlcy4gUm91dGluZyBrZXkgPSAndGVhbXMnLiIKICAgICAgICAgICAgICAgIHRhZ3MgIlJhYmJpdE1RIiwgIlF1ZXVlIiwgIkludGVncmF0aW9uIFRpZXIiLCAiVGVhbXMiCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBpbnRlZ3JhdGlvblNsYWNrUmV0cnlRdWV1ZSA9IGNvbXBvbmVudCAiaW50ZWdyYXRpb24tc2xhY2stcmV0cnktcXVldWUiIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbnRlZ3JhdGlvbi1sZXZlbCByZXRyeSBxdWV1ZSBmb3IgU2xhY2sgSW50ZWdyYXRpb25NZXNzYWdlcy4gUm91dGluZyBrZXkgTGFiZWwgPSAnc2xhY2stcmV0cnknLiIKICAgICAgICAgICAgICAgIHRhZ3MgIlJhYmJpdE1RIiwgIlF1ZXVlIiwgIkludGVncmF0aW9uIFRpZXIiLCAiU2xhY2siCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBpbnRlZ3JhdGlvbldlYmhvb2tSZXRyeVF1ZXVlID0gY29tcG9uZW50ICJpbnRlZ3JhdGlvbi13ZWJob29rLXJldHJ5LXF1ZXVlIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW50ZWdyYXRpb24tbGV2ZWwgcmV0cnkgcXVldWUgZm9yIFdlYmhvb2sgSW50ZWdyYXRpb25NZXNzYWdlcy4gUm91dGluZyBrZXkgPSAnd2ViaG9vay1yZXRyeScuIgogICAgICAgICAgICAgICAgdGFncyAiUmFiYml0TVEiLCAiUXVldWUiLCAiSW50ZWdyYXRpb24gVGllciIsICJXZWJob29rIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgaW50ZWdyYXRpb25IZWNSZXRyeVF1ZXVlID0gY29tcG9uZW50ICJpbnRlZ3JhdGlvbi1oZWMtcmV0cnktcXVldWUiIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJJbnRlZ3JhdGlvbi1sZXZlbCByZXRyeSBxdWV1ZSBmb3IgSEVDIEludGVncmF0aW9uTWVzc2FnZXMuIFJvdXRpbmcga2V5ID0gJ2hlYy1yZXRyeScuIgogICAgICAgICAgICAgICAgdGFncyAiUmFiYml0TVEiLCAiUXVldWUiLCAiSW50ZWdyYXRpb24gVGllciIsICJIRUMiCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICBpbnRlZ3JhdGlvbkRhdGFkb2dSZXRyeVF1ZXVlID0gY29tcG9uZW50ICJpbnRlZ3JhdGlvbi1kYXRhZG9nLXJldHJ5LXF1ZXVlIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW50ZWdyYXRpb24tbGV2ZWwgcmV0cnkgcXVldWUgZm9yIERhdGFkb2cgSW50ZWdyYXRpb25NZXNzYWdlcy4gUm91dGluZyBrZXkgPSAnZGF0YWRvZy1yZXRyeScuIgogICAgICAgICAgICAgICAgdGFncyAiUmFiYml0TVEiLCAiUXVldWUiLCAiSW50ZWdyYXRpb24gVGllciIsICJEYXRhZG9nIgogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgaW50ZWdyYXRpb25UZWFtc1JldHJ5UXVldWUgPSBjb21wb25lbnQgImludGVncmF0aW9uLXRlYW1zLXJldHJ5LXF1ZXVlIiB7CiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSW50ZWdyYXRpb24tbGV2ZWwgcmV0cnkgcXVldWUgZm9yIFRlYW1zIEludGVncmF0aW9uTWVzc2FnZXMuIFJvdXRpbmcga2V5ID0gJ3RlYW1zLXJldHJ5Jy4iCiAgICAgICAgICAgICAgICB0YWdzICJSYWJiaXRNUSIsICJRdWV1ZSIsICJJbnRlZ3JhdGlvbiBUaWVyIiwgIlRlYW1zIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAhZWxlbWVudCBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3NvciB7CiAgICAgICAgdGFncyAiQ2xvdWQtT25seSIKICAgIAogICAgICAgIGV2ZW50X3JlcG9zaXRvcnlfaGFuZGxlciA9IGNvbXBvbmVudCAiRXZlbnRSZXBvc2l0b3J5SGFuZGxlciIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiSGFuZGxlcyBhbGwgZXZlbnRzLCBwYXNzaW5nIHRoZW0gb2ZmIHRvIHRoZSBJRXZlbnRXcml0ZVNlcnZpY2Ugd2l0aCB0aGUgYHBlcnNpc3RlbnRgIGtleSBmb3IgbG9uZyB0ZXJtIHN0b3JhZ2UuIgogICAgICAgIH0KICAgICAgICBldmVudF9saXN0ZW5lciA9IGNvbXBvbmVudCAiQXp1cmVTZXJ2aWNlQnVzRXZlbnRMaXN0ZW5lclNlcnZpY2UiIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3RlbnMgdG8gYSBzcGVjaWZpYyBzdWJzY3JpcHRpb24gYW5kIHBhc3NlcyBvZmYgdG8gYSBoYW5kbGVyIHRvIGhhbmRsZSBldmVudHMiCiAgICAgICAgfQogICAgICAgIGludGVncmF0aW9uX2xpc3RlbmVyID0gY29tcG9uZW50ICJBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbkxpc3RlbmVyU2VydmljZSIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdGVucyB0byBhIHNwZWNpZmljIHN1YnNjcmlwdGlvbiBhbmQgcGFzc2VzIG9mZiB0byBhIGhhbmRsZXIgdG8gaGFuZGxlIEludGVncmF0aW9uTWVzc2FnZXMiCiAgICAgICAgfQogICAgICAgIGV2ZW50X2ludGVncmF0aW9uX2hhbmRsZXIgPSBjb21wb25lbnQgIkV2ZW50SW50ZWdyYXRpb25IYW5kbGVyIiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJGZXRjaGVzIHRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyB3aGVuIGFuIGV2ZW50IGNvbWVzIGluIGFuZCBoYW5kcyB0aGUgZXZlbnQgdG8gaXRzIHBhaXJlZCBpbnRlZ3JhdGlvbiBoYW5kbGVyIGZvciBwcm9jZXNzaW5nLiIKICAgICAgICB9CiAgICAgICAgc2xhY2tfaW50ZWdyYXRpb25faGFuZGxlciA9IGNvbXBvbmVudCAiU2xhY2tJbnRlZ3JhdGlvbkhhbmRsZXIiIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb2Nlc3NlcyBTbGFjayBJbnRlZ3JhdGlvbk1lc3NhZ2VzLCBwb3N0aW5nIHRoZW0gdG8gdGhlIGNvbmZpZ3VyZWQgY2hhbm5lbHMuIgogICAgICAgIH0KICAgICAgICB0ZWFtc19pbnRlZ3JhdGlvbl9oYW5kbGVyID0gY29tcG9uZW50ICJUZWFtc0ludGVncmF0aW9uSGFuZGxlciIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvY2Vzc2VzIFRlYW1zIEludGVncmF0aW9uTWVzc2FnZXMsIHBvc3RpbmcgdGhlbSB0byB0aGUgY29uZmlndXJlZCBjaGFubmVscy4iCiAgICAgICAgfQogICAgICAgIGRhdGFkb2dfaW50ZWdyYXRpb25faGFuZGxlciA9IGNvbXBvbmVudCAiRGF0YWRvZ0ludGVncmF0aW9uSGFuZGxlciIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvY2Vzc2VzIERhdGFkb2cgSW50ZWdyYXRpb25NZXNzYWdlcywgcG9zdGluZyB0aGVtIHRvIHRoZSBjb25maWd1cmVkIFVSSS4iCiAgICAgICAgfQogICAgICAgIHdlYmhvb2tfaW50ZWdyYXRpb25faGFuZGxlciA9IGNvbXBvbmVudCAiV2ViaG9va0ludGVncmF0aW9uSGFuZGxlciIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvY2Vzc2VzIFdlYmhvb2sgYW5kIEhFQyBJbnRlZ3JhdGlvbk1lc3NhZ2VzLCBwb3N0aW5nIHRoZW0gdG8gdGhlIGNvbmZpZ3VyZWQgVVJJLiIKICAgICAgICB9CiAgICAgICAgZXZlbnRfaW50ZWdyYXRpb25zX2V4dGVuZGVkX2NhY2hlID0gY29tcG9uZW50ICJFdmVudEludGVncmF0aW9uc0V4dGVuZGVkQ2FjaGUiIHsKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkNhY2hlcyBhbGwgY29uZmlndXJhdGlvbnMgZm9yIGludGVncmF0aW9ucyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgaGFuZGxlZCB3aXRob3V0IGFkZGluZyBkYXRhYmFzZSBsb2FkLiIKICAgICAgICB9CiAgICAgICAgc2xhY2tfc2VydmljZSA9IGNvbXBvbmVudCAiU2xhY2tTZXJ2aWNlIiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJIYW5kbGVzIGFsbCBBUEkgaW50ZXJhY3Rpb24gd2l0aCBTbGFjay4iCiAgICAgICAgfQogICAgICAgIHRlYW1zX3NlcnZpY2UgPSBjb21wb25lbnQgIlRlYW1zU2VydmljZSIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiSGFuZGxlcyBhbGwgQVBJIGludGVyYWN0aW9uIHdpdGggVGVhbXMuIgogICAgICAgIH0KICAgICAgICBodHRwX2NsaWVudCA9IGNvbXBvbmVudCAiSHR0cENsaWVudCIgewogICAgICAgICAgICBkZXNjcmlwdGlvbiAiUGVyZm9ybXMgYW55IEhUVFAgZnVuY3Rpb25zIGZvciBEYXRhZG9nIC8gV2ViaG9va3MgLyBIRUMuIgogICAgICAgIH0KICAgICAgICBpbnRlZ3JhdGlvbl9maWx0ZXJfc2VydmljZSA9IGNvbXBvbmVudCAiSW50ZWdyYXRpb25GaWx0ZXJTZXJ2aWNlIiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQcm9jZXNzZXMgZmlsdGVycyBmcm9tIGNvbmZpZ3VyYXRpb25zIHRvIGRldGVybWluZSBpZiBhbiBldmVudCBzaG91bGQgYmUgcHJvY2Vzc2VkIG91dCB0byB0aGUgaW50ZWdyYXRpb24uIgogICAgICAgIH0KICAgIH0KICAgIAogICAgIWVsZW1lbnQgc2VydmVyLmV2ZW50cyB7CiAgICAgICAgZXZlbnRfbGlzdGVuZXIgPSBjb21wb25lbnQgIlJhYmJpdE1xRXZlbnRMaXN0ZW5lclNlcnZpY2UiIHsKICAgICAgICAgICAgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3RlbnMgdG8gYSBzcGVjaWZpYyBxdWV1ZSBhbmQgcGFzc2VzIG9mZiB0byBhIGhhbmRsZXIgdG8gaGFuZGxlIGV2ZW50cyIKICAgICAgICB9CiAgICAgICAgaW50ZWdyYXRpb25fbGlzdGVuZXIgPSBjb21wb25lbnQgIlJhYmJpdE1xSW50ZWdyYXRpb25MaXN0ZW5lclNlcnZpY2UiIHsKICAgICAgICAgICAgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkxpc3RlbnMgdG8gYSBzcGVjaWZpYyBxdWV1ZSBhbmQgcGFzc2VzIG9mZiB0byBhIGhhbmRsZXIgdG8gaGFuZGxlIEludGVncmF0aW9uTWVzc2FnZXMiCiAgICAgICAgfQogICAgICAgIGV2ZW50X3JlcG9zaXRvcnlfaGFuZGxlciA9IGNvbXBvbmVudCAiRXZlbnRSZXBvc2l0b3J5SGFuZGxlciIgewogICAgICAgICAgICB0YWdzICJTZWxmLUhvc3RlZC1Pbmx5IgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiSGFuZGxlcyBhbGwgZXZlbnRzLCBwYXNzaW5nIHRoZW0gb2ZmIHRvIHRoZSBJRXZlbnRXcml0ZVNlcnZpY2Ugd2l0aCB0aGUgYHBlcnNpc3RlbnRgIGtleSBmb3IgbG9uZyB0ZXJtIHN0b3JhZ2UuIgogICAgICAgIH0KICAgICAgICBldmVudF9pbnRlZ3JhdGlvbl9oYW5kbGVyID0gY29tcG9uZW50ICJFdmVudEludGVncmF0aW9uSGFuZGxlciIgewogICAgICAgICAgICB0YWdzICJTZWxmLUhvc3RlZC1Pbmx5IgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiRmV0Y2hlcyB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgd2hlbiBhbiBldmVudCBjb21lcyBpbiBhbmQgaGFuZHMgdGhlIGV2ZW50IHRvIGl0cyBwYWlyZWQgaW50ZWdyYXRpb24gaGFuZGxlciBmb3IgcHJvY2Vzc2luZy4iCiAgICAgICAgfQogICAgICAgIHNsYWNrX2ludGVncmF0aW9uX2hhbmRsZXIgPSBjb21wb25lbnQgIlNsYWNrSW50ZWdyYXRpb25IYW5kbGVyIiB7CiAgICAgICAgICAgIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQcm9jZXNzZXMgU2xhY2sgSW50ZWdyYXRpb25NZXNzYWdlcywgcG9zdGluZyB0aGVtIHRvIHRoZSBjb25maWd1cmVkIGNoYW5uZWxzLiIKICAgICAgICB9CiAgICAgICAgdGVhbXNfaW50ZWdyYXRpb25faGFuZGxlciA9IGNvbXBvbmVudCAiVGVhbXNJbnRlZ3JhdGlvbkhhbmRsZXIiIHsKICAgICAgICAgICAgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb2Nlc3NlcyBUZWFtcyBJbnRlZ3JhdGlvbk1lc3NhZ2VzLCBwb3N0aW5nIHRoZW0gdG8gdGhlIGNvbmZpZ3VyZWQgY2hhbm5lbHMuIgogICAgICAgIH0KICAgICAgICBkYXRhZG9nX2ludGVncmF0aW9uX2hhbmRsZXIgPSBjb21wb25lbnQgIkRhdGFkb2dJbnRlZ3JhdGlvbkhhbmRsZXIiIHsKICAgICAgICAgICAgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb2Nlc3NlcyBEYXRhZG9nIEludGVncmF0aW9uTWVzc2FnZXMsIHBvc3RpbmcgdGhlbSB0byB0aGUgY29uZmlndXJlZCBVUkkuIgogICAgICAgIH0KICAgICAgICB3ZWJob29rX2ludGVncmF0aW9uX2hhbmRsZXIgPSBjb21wb25lbnQgIldlYmhvb2tJbnRlZ3JhdGlvbkhhbmRsZXIiIHsKICAgICAgICAgICAgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb2Nlc3NlcyBXZWJob29rIGFuZCBIRUMgSW50ZWdyYXRpb25NZXNzYWdlcywgcG9zdGluZyB0aGVtIHRvIHRoZSBjb25maWd1cmVkIFVSSS4iCiAgICAgICAgfQogICAgICAgIGV2ZW50X2ludGVncmF0aW9uc19leHRlbmRlZF9jYWNoZSA9IGNvbXBvbmVudCAiRXZlbnRJbnRlZ3JhdGlvbnNFeHRlbmRlZENhY2hlIiB7CiAgICAgICAgICAgIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDYWNoZXMgYWxsIGNvbmZpZ3VyYXRpb25zIGZvciBpbnRlZ3JhdGlvbnMgaW4gbWVtb3J5IHNvIHRoYXQgZXZlbnRzIGNhbiBiZSBoYW5kbGVkIHdpdGhvdXQgYWRkaW5nIGRhdGFiYXNlIGxvYWQuIgogICAgICAgIH0KICAgICAgICBzbGFja19zZXJ2aWNlID0gY29tcG9uZW50ICJTbGFja1NlcnZpY2UiIHsKICAgICAgICAgICAgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIkhhbmRsZXMgYWxsIEFQSSBpbnRlcmFjdGlvbiB3aXRoIFNsYWNrLiIKICAgICAgICB9CiAgICAgICAgdGVhbXNfc2VydmljZSA9IGNvbXBvbmVudCAiVGVhbXNTZXJ2aWNlIiB7CiAgICAgICAgICAgIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJIYW5kbGVzIGFsbCBBUEkgaW50ZXJhY3Rpb24gd2l0aCBUZWFtcy4iCiAgICAgICAgfQogICAgICAgIGh0dHBfY2xpZW50ID0gY29tcG9uZW50ICJIdHRwQ2xpZW50IiB7CiAgICAgICAgICAgIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJQZXJmb3JtcyBhbnkgSHR0cCBmdW5jdGlvbnMgZm9yIERhdGFkb2cgLyBXZWJob29rcyAvIEhFQy4iCiAgICAgICAgfQogICAgICAgIGludGVncmF0aW9uX2ZpbHRlcl9zZXJ2aWNlID0gY29tcG9uZW50ICJJbnRlZ3JhdGlvbkZpbHRlclNlcnZpY2UiIHsKICAgICAgICAgICAgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb2Nlc3NlcyBmaWx0ZXJzIGZyb20gY29uZmlndXJhdGlvbnMgdG8gZGV0ZXJtaW5lIGlmIGFuIGV2ZW50IHNob3VsZCBiZSBwcm9jZXNzZWQgb3V0IHRvIHRoZSBpbnRlZ3JhdGlvbi4iCiAgICAgICAgfQogICAgfQogICAgCiAgICBleHRlcm5hbF9zZXJ2aWNlcyA9IHNvZnR3YXJlU3lzdGVtICJFeHRlcm5hbCBTZXJ2aWNlcyIgewogICAgICAgIHRhZ3MgIkV4dGVybmFsIiwgIkV2ZW50cyIsICJJbnRlZ3JhdGlvbnMiCiAgICAgICAgZGVzY3JpcHRpb24gIkV4dGVybmFsIHNlcnZpY2VzIChlLmcuIFNJRU0sIFNsYWNrLCBldCBhbCkgdGhhdCBjb25zdW1lIGV2ZW50cyB2aWEgaW50ZWdyYXRpb25zIgogICAgCiAgICAgICAgc2xhY2sgPSBjb250YWluZXIgIlNsYWNrIiB7CiAgICAgICAgICAgIHRhZ3MgIkV4dGVybmFsIiwgIkV2ZW50cyIsICJJbnRlZ3JhdGlvbnMiLCAiU2xhY2siCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTbGFjayBtZXNzYWdpbmcgc2VydmljZS4gUmVjZWl2ZXMgbWVzc2FnZXMgdmlhIGNvbmZpZ3VyZWQgZXZlbnQgaW50ZWdyYXRpb25zLiIKICAgICAgICB9CiAgICAKICAgICAgICB0ZWFtcyA9IGNvbnRhaW5lciAiVGVhbXMiIHsKICAgICAgICAgICAgdGFncyAiRXh0ZXJuYWwiLCAiRXZlbnRzIiwgIkludGVncmF0aW9ucyIsICJUZWFtcyIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIk1pY3Jvc29mdCBUZWFtcyBtZXNzYWdpbmcgc2VydmljZS4gUmVjZWl2ZXMgbWVzc2FnZXMgdmlhIGNvbmZpZ3VyZWQgZXZlbnQgaW50ZWdyYXRpb25zLiIKICAgICAgICB9CiAgICAKICAgICAgICBzcGx1bmsgPSBjb250YWluZXIgIlNwbHVuayIgewogICAgICAgICAgICB0YWdzICJFeHRlcm5hbCIsICJFdmVudHMiLCAiSW50ZWdyYXRpb25zIiwgIlNwbHVuayIKICAgICAgICAgICAgZGVzY3JpcHRpb24gIlNwbHVuayBTSUVNIHNlcnZpY2UuIFJlY2VpdmVzIGV2ZW50cyB2aWEgY29uZmlndXJlZCBldmVudCBpbnRlZ3JhdGlvbnMuIgogICAgICAgIH0KICAgIAogICAgICAgIGRhdGFkb2cgPSBjb250YWluZXIgIkRhdGFkb2ciIHsKICAgICAgICAgICAgdGFncyAiRXh0ZXJuYWwiLCAiRXZlbnRzIiwgIkludGVncmF0aW9ucyIsICJEYXRhZG9nIgogICAgICAgICAgICBkZXNjcmlwdGlvbiAiRGF0YWRvZyBTSUVNIHNlcnZpY2UuIFJlY2VpdmVzIGV2ZW50cyB2aWEgY29uZmlndXJlZCBldmVudCBpbnRlZ3JhdGlvbnMuIgogICAgICAgIH0KICAgIAogICAgICAgIGNyb3dkc3RyaWtlID0gY29udGFpbmVyICJDcm93ZHN0cmlrZSBGYWxjb24iIHsKICAgICAgICAgICAgdGFncyAiRXh0ZXJuYWwiLCAiRXZlbnRzIiwgIkludGVncmF0aW9ucyIsICJDcm93ZHN0cmlrZSBGYWxjb24iLCAiQ3Jvd2RzdHJpa2UiCiAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDcm93ZHN0cmlrZSBGYWxjb24gU0lFTSBzZXJ2aWNlLiBSZWNlaXZlcyBldmVudHMgdmlhIGNvbmZpZ3VyZWQgZXZlbnQgaW50ZWdyYXRpb25zLiIKICAgICAgICB9CiAgICB9CiAgICAhZWxlbWVudCBzZXJ2ZXIgewogICAgICBpY29ucyA9IGNvbnRhaW5lciAiSWNvbnMiIHsKICAgICAgICAhZG9jcyAidGhyZWF0X21vZGVsLm1kIgogICAgICAgIGljb25zX2NvbnRyb2xsZXIgPSBjb21wb25lbnQgIkljb25zQ29udHJvbGxlciIgewogICAgICAgICAgZGVzY3JpcHRpb24gIkljb25zQ29udHJvbGxlciIKICAgICAgICAgIHRlY2hub2xvZ3kgIkMjIEFTUC5ORVQgQ29yZSIKICAgICAgICAgIAogICAgICAgIH0KICAgICAgICBpbmZvX2NvbnRyb2xsZXIgPSBjb21wb25lbnQgIkluZm9Db250cm9sbGVyIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlcGxveWVkIGljb24gc2VydmljZS4gQWxsb3cgZm9yIGhlYWx0aCBjaGVja3MuIgogICAgICAgICAgdGVjaG5vbG9neSAiQyMgQVNQLk5FVCBDb3JlIgogICAgICAgICAgdGFncyAiSW5mbyIgIkhlYWx0aENoZWNrIgogICAgICAgIH0KICAgICAgICBpY29uX2RldGVybWluYXRpb24gPSBjb21wb25lbnQgIkljb25EZXRlcm1pbmF0aW9uIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiUmVzb2x2ZXMgYSBzaW5nbGUgc291cmNlIGZvciBhIHdlYnNpdGUgaWNvbiBhbmQgZG93bmxvYWRzIGl0LiIKICAgICAgICB9CiAgICAgICAgaWNvbl9jYWNoZSA9IGNvbXBvbmVudCAiSWNvbkNhY2hlIiB7CiAgICAgICAgICBkZXNjcmlwdGlvbiAiQ2FjaGVzIGljb25zIGZvciBhIGdpdmVuIGRvbWFpbiIKICAgICAgICAgIHRhZ3MgIkNhY2hlIgogICAgICAgICAgdGVjaG5vbG9neSAiQyMgTWVtb3J5Q2FjaGUiCiAgICAgICAgfQogICAgCiAgICAgICAgY2xpZW50cyAtPiBpY29uc19jb250cm9sbGVyICJSZXF1ZXN0cyBpY29ucyBmb3IgY2xlYXJ0ZXh0IHVybHMgZnJvbSIgewogICAgICAgICAgcGVyc3BlY3RpdmVzIHsKICAgICAgICAgICAgIlNlY3VyaXR5IiAiICAgICAgICAgICAgSWNvbnMgMS4yLjEgQnJva2VuIFNTTCBjb21tdW5pY2F0aW9uIGV4cG9zZXMgdmF1bHQgY29udGVudHMgdG8gbmV0d29yayBhZG1pbmlzdHJhdG9ycyBcblxuICAgICAgICAgICAgSWNvbnMgMS4yLjIgVHJhY2tpbmcgb2YgdXNlciB2YXVsdCBjb250ZW50cyBieSBpcCBjb3JyZWxhdGlvbiBiZXR3ZWVuIGlkZW50aXR5IGFuZCBpY29ucyBzZXJ2aWNlcyBcblxuICAgICAgICAgICAgSWNvbnMgMS4yLjMgTm8gU0xBIG9mZmVyZWQgb24gSWNvbnMgc2VydmljZSwgZ3JhY2VmdWwgZGVncmFkYXRpb24gb2YgZmVhdHVyZXMgbmVlZGVkIGlmIGl0IGdvZXMgZG93biBcblxuICAgICAgICAgICAgSWNvbnMgMS4yLjQgU1NSRiB0aHJvdWdoIGNyYWZ0ZWQgaW5wdXQgcmVzb2x2aW5nIHRvIGEgbG9jYXRpb24gdGhlIHNlcnZlciBoYXMgZWxldmF0ZWQgcHJpdmlsZWdlcyBpbiIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWNvbnNfY29udHJvbGxlciAtPiBpY29uX2RldGVybWluYXRpb24gIlJlcXVlc3RzIGljb25zIGZyb20iCiAgICAgICAgaWNvbnNfY29udHJvbGxlciAtPiBpY29uX2NhY2hlICJDYWNoZXMgaWNvbnMgaW4iIHsKICAgICAgICAgIHBlcnNwZWN0aXZlcyB7CiAgICAgICAgICAgICJTZWN1cml0eSIgIiAgICAgICAgICAgIEljb25zIDEuMy4xIEFnZ3JlZ2F0ZSB2YXVsdCBjb250ZW50IGxlYWsgdGhyb3VnaCB0aW1pbmcgYXR0YWNrIG9uIGNhY2hlIFxuXG4gICAgICAgICAgICBJY29ucyAxLjMuMiBQb3NzaWJsZSBpbmplY3Rpb24gYXR0YWNrIHRocm91Z2ggY2FjaGUga2V5IFxuXG4gICAgICAgICAgICBJY29ucyAxLjMuMyAmIEljb25zIDEuMy40IENhY2hlIGJsb2F0IGxlYWRpbmcgdG8gRG9TIFxuXG4gICAgICAgICAgICBJY29ucyAxLjMuNSBDYWNoZSBwb2lzb25pbmcgbGVhZGluZyB0byBpbmNvcnJlY3QgaWNvbiBzdG9yYWdlICIKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIAogICAgZG5zID0gc29mdHdhcmVTeXN0ZW0gIkROUyIgewogICAgICB0YWdzICJFeHRlcm5hbCIKICAgICAgdGFncyAiSWNvbnMiCiAgICB9CiAgICAKICAgIHNlcnZlci5pY29ucy5pY29uX2RldGVybWluYXRpb24gLT4gZG5zICJSZXNvbHZlcyBJUCBhZGRyZXNzZXMgZm9yIGRvbWFpbiBuYW1lcyBmcm9tIgogICAgCiAgICBleHRlcm5hbF93ZWJzaXRlcyA9IHNvZnR3YXJlU3lzdGVtICJFeHRlcm5hbCBXZWJzaXRlcyIgewogICAgICB0YWdzICJFeHRlcm5hbCIKICAgICAgdGFncyAiSWNvbnMiCiAgICB9CiAgICAKICAgIHNlcnZlci5pY29ucy5pY29uX2RldGVybWluYXRpb24gLT4gZXh0ZXJuYWxfd2Vic2l0ZXMgIlJldHJpZXZlcyBpY29ucyBmcm9tIgoKICAgICMgSW5jbHVkZSBzaGFyZWQgbGV2ZWwgcmVsYXRpb25zaGlwcwogICAgIyBVc2VyIFJlbGF0aW9uc2hpcHMKICAgIHVzZXIgLT4gY2xpZW50cy53ZWIgIlVzZXMiCiAgICB1c2VyIC0+IGNsaWVudHMuaW9zICJVc2VzIgogICAgdXNlciAtPiBjbGllbnRzLmFuZHJvaWQgIlVzZXMiCiAgICB1c2VyIC0+IGNsaWVudHMuYnJvd3Nlcl9leHRlbnNpb24gIlVzZXMiCiAgICB1c2VyIC0+IGNsaWVudHMuY2xpICJVc2VzIgogICAgdXNlciAtPiBjbGllbnRzLmRlc2t0b3AgIlVzZXMiCiAgICBhZG1pbiAtPiBjbGllbnRzLndlYiAiQWRtaW5pc3RlcnMgT3JnYW5pemF0aW9ucyIKICAgIHByb3ZpZGVyIC0+IHNlcnZlci5wb3J0YWwgIkNvbXBsZXRlcyBQcm92aWRlciByZWdpc3RyYXRpb24gd2l0aCIKICAgIHByb3ZpZGVyIC0+IGNsaWVudHMud2ViICJBZG1pbmlzdGVycyBQcm92aWRlcnMgYW5kIE9yZ2FuaXphdGlvbnMiCiAgICBjdXN0b21lcl9zdWNjZXNzIC0+IHNlcnZlci5wb3J0YWwgIkluc3BlY3RzIGFuZCBzdXBwb3J0cyIKICAgIHN5c3RlbV9hZG1pbiAtPiBzZXJ2ZXIucG9ydGFsICJBZG1pbmlzdGVycyBTeXN0ZW0iCiAgICAKICAgICMgSGlnaC1sZXZlbCBDbGllbnQgUmVsYXRpb25zaGlwcwogICAgY2xpZW50cy53ZWIgLT4gc2VydmVyLmFwaSAiTWFrZXMgcmVxdWVzdHMgdG8iCiAgICBjbGllbnRzLmlvcyAtPiBzZXJ2ZXIuYXBpICJNYWtlcyByZXF1ZXN0cyB0byIKICAgIGNsaWVudHMuYW5kcm9pZCAtPiBzZXJ2ZXIuYXBpICJNYWtlcyByZXF1ZXN0cyB0byIKICAgIGNsaWVudHMuYnJvd3Nlcl9leHRlbnNpb24gLT4gc2VydmVyLmFwaSAiTWFrZXMgcmVxdWVzdHMgdG8iCiAgICBjbGllbnRzLmNsaSAtPiBzZXJ2ZXIuYXBpICJNYWtlcyByZXF1ZXN0cyB0byIKICAgIGNsaWVudHMuZGVza3RvcCAtPiBzZXJ2ZXIuYXBpICJNYWtlcyByZXF1ZXN0cyB0byIKICAgIGNsaWVudHMud2ViIC0+IHNlcnZlci5pZGVudGl0eSAiQXV0aGVudGljYXRlcyB3aXRoIgogICAgY2xpZW50cy5pb3MgLT4gc2VydmVyLmlkZW50aXR5ICJBdXRoZW50aWNhdGVzIFdpdGgiCiAgICBjbGllbnRzLmFuZHJvaWQgLT4gc2VydmVyLmlkZW50aXR5ICJBdXRoZW50aWNhdGVzIFdpdGgiCiAgICBjbGllbnRzLmJyb3dzZXJfZXh0ZW5zaW9uIC0+IHNlcnZlci5pZGVudGl0eSAiQXV0aGVudGljYXRlcyBXaXRoIgogICAgY2xpZW50cy5jbGkgLT4gc2VydmVyLmlkZW50aXR5ICJBdXRoZW50aWNhdGVzIFdpdGgiCiAgICBjbGllbnRzLmRlc2t0b3AgLT4gc2VydmVyLmlkZW50aXR5ICJBdXRoZW50aWNhdGVzIFdpdGgiCiAgICBzZXJ2ZXIuYXBpIC0+IHNlcnZlci5pZGVudGl0eSAiVmFsaWRhdGVzIEpXVHMgd2l0aCIgewogICAgICB1cmwgImh0dHBzOi8vYml0d2FyZGVuLmNvbSIKICAgIH0KICAgIGNsaWVudHMgLT4gc2VydmVyLmV2ZW50cyAiUG9zdHMgbG9jYWwgdXNhZ2UgZXZlbnRzIHRvIgogICAgCiAgICAjIERhdGFiYXNlIFJlbGF0aW9uc2hpcHMKICAgIAogICAgc2VydmVyLmFwaSAtPiBzZXJ2ZXIuZGF0YWJhc2UgIlF1ZXJpZXMiCiAgICBzZXJ2ZXIucG9ydGFsIC0+IHNlcnZlci5kYXRhYmFzZSAiUXVlcmllcyIKICAgIAogICAgIyBxdWV1ZSBSZWxhdGlvbnNoaXBzCiAgICBzZXJ2ZXIuYXBpIC0+IHNlcnZlci5tYWlsX3F1ZXVlICJTZW5kcyBlbWFpbHMgdG8iCiAgICBzZXJ2ZXIuYXBpIC0+IHNlcnZlci5ub3RpZmljYXRpb25zX3F1ZXVlICJTZW5kcyBub3RpZmljYXRpb25zIHRvIgogICAgc2VydmVyLm5vdGlmaWNhdGlvbnMgLT4gc2VydmVyLm5vdGlmaWNhdGlvbnNfcXVldWUgIlNlbmRzIG5vdGlmaWNhdGlvbnMgdG8iCiAgICBzZXJ2ZXIubWFpbF9xdWV1ZSAtPiBzZXJ2ZXIucG9ydGFsICJQcm9jZXNzZXMgZW1haWxzIGZyb20iCiAgICAKICAgICMgc2VsZiBob3N0IHBob25lIGhvbWUKICAgIHNlbGZfaG9zdGVkX2luc3RhbmNlcyAtPiBzZXJ2ZXIubm90aWZpY2F0aW9ucyAiU2VuZHMgcHVzaCBub3RpZmljYXRpb24gcHJveHkgcmVxdWVzdHMgdG8iCgogICAgc2VydmVyLnNjaW0gLT4gc2VydmVyLmRhdGFiYXNlICJRdWVyaWVzIgogICAgc2VydmVyLmlkZW50aXR5IC0+IHNlcnZlci5kYXRhYmFzZSAiUXVlcmllcyIKICAgIHNlcnZlci5zc28gLT4gc2VydmVyLmRhdGFiYXNlICJRdWVyaWVzIgogICAgIyBIaWdoLWxldmVsIHByb3ZpZGVyIHJlbGF0aW9uc2hpcHMKICAgIHNlcnZlci5hcGkuYmlsbGluZyAtPiBzdHJpcGUgIlJlcXVlc3RzIHBheW1lbnRzIGZvciBjdXN0b21lcnMiCiAgICBzZXJ2ZXIuYXBpLmJpbGxpbmcgLT4gYnJhaW50cmVlICJSZXF1ZXN0cyBwYXltZW50cyBmb3IgY3VzdG9tZXJzIgogICAgc3RyaXBlIC0+IHNlcnZlci5hcGkuYmlsbGluZyAiU2VuZHMgc3Vic2NyaXB0aW9uIGV2ZW50cyB0byIKICAgICMgVG9wIExldmVsIGV2ZW50IHB1Ymxpc2hpbmcKICAgIHNlcnZlci5hcGkgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmV2ZW50X3RvcGljICJTZW5kcyBldmVudHMgdG8iCiAgICBzZXJ2ZXIuZXZlbnRzIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudF90b3BpYyAiU2VuZHMgZXZlbnRzIHRvIgogICAgc2VydmVyLmlkZW50aXR5IC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudF90b3BpYyAiU2VuZHMgZXZlbnRzIHRvIgogICAgc2VydmVyLnNzbyAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRfdG9waWMgIlNlbmRzIGV2ZW50cyB0byIKICAgIHNlcnZlci5zY2ltIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudF90b3BpYyAiU2VuZHMgZXZlbnRzIHRvIgogICAgc2VydmVyLmFwaSAtPiBzZXJ2ZXIucmFiYml0X21xLmV2ZW50X2V4Y2hhbmdlICJTZW5kcyBldmVudHMgdG8iCiAgICBzZXJ2ZXIuZXZlbnRzIC0+IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRfZXhjaGFuZ2UgIlNlbmRzIGV2ZW50cyB0byIKICAgIHNlcnZlci5pZGVudGl0eSAtPiBzZXJ2ZXIucmFiYml0X21xLmV2ZW50X2V4Y2hhbmdlICJTZW5kcyBldmVudHMgdG8iCiAgICBzZXJ2ZXIuc3NvIC0+IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRfZXhjaGFuZ2UgIlNlbmRzIGV2ZW50cyB0byIKICAgIHNlcnZlci5zY2ltIC0+IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRfZXhjaGFuZ2UgIlNlbmRzIGV2ZW50cyB0byIKICAgIAogICAgIyBBenVyZSBTZXJ2aWNlIEJ1cyB0b3BpY3MsIHN1YnNjcmlwdGlvbnMsIGFuZCByb3V0aW5nCiAgICBldmVudHNXcml0ZVN1YiA9IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudF90b3BpYyAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRzV3JpdGVTdWIgICJTdWJzY3JpYmVzIHZpYSBmYW4tb3V0IgogICAgZXZlbnRzRGF0YWRvZ1N1YiA9IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudF90b3BpYyAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRzRGF0YWRvZ1N1YiAiU3Vic2NyaWJlcyB2aWEgZmFuLW91dCIKICAgIGV2ZW50c0hlY1N1YiA9IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudF90b3BpYyAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRzSGVjU3ViICJTdWJzY3JpYmVzIHZpYSBmYW4tb3V0IgogICAgZXZlbnRzU2xhY2tTdWIgPSBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRfdG9waWMgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmV2ZW50c1NsYWNrU3ViICJTdWJzY3JpYmVzIHZpYSBmYW4tb3V0IgogICAgZXZlbnRzVGVhbXNTdWIgPSBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRfdG9waWMgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmV2ZW50c1RlYW1zU3ViICJTdWJzY3JpYmVzIHZpYSBmYW4tb3V0IgogICAgZXZlbnRzV2ViaG9va1N1YiA9IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudF90b3BpYyAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRzV2ViaG9va1N1YiAgIlN1YnNjcmliZXMgdmlhIGZhbi1vdXQiCiAgICBpbnRlZ3JhdGlvbkRhdGFkb2dTdWIgPSBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuaW50ZWdyYXRpb25fdG9waWMgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmludGVncmF0aW9uRGF0YWRvZ1N1YiAiU3Vic2NyaWJlcyB2aWEgZmlsdGVyIG9uIERhdGFkb2cga2V5IgogICAgaW50ZWdyYXRpb25IZWNTdWIgPSBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuaW50ZWdyYXRpb25fdG9waWMgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmludGVncmF0aW9uSGVjU3ViICJTdWJzY3JpYmVzIHZpYSBmaWx0ZXIgb24gSEVDIGtleSIKICAgIGludGVncmF0aW9uU2xhY2tTdWIgPSBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuaW50ZWdyYXRpb25fdG9waWMgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmludGVncmF0aW9uU2xhY2tTdWIgIlN1YnNjcmliZXMgdmlhIGZpbHRlciBvbiBTbGFjayBrZXkiCiAgICBpbnRlZ3JhdGlvblRlYW1zU3ViID0gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmludGVncmF0aW9uX3RvcGljIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5pbnRlZ3JhdGlvblRlYW1zU3ViICJTdWJzY3JpYmVzIHZpYSBmaWx0ZXIgb24gVGVhbXMga2V5IgogICAgaW50ZWdyYXRpb25XZWJob29rU3ViID0gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmludGVncmF0aW9uX3RvcGljIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5pbnRlZ3JhdGlvbldlYmhvb2tTdWIgIlN1YnNjcmliZXMgdmlhIGZpbHRlciBvbiBXZWJob29rIGtleSIKICAgIAogICAgZXZlbnRzV3JpdGVMaXN0ZW5lciA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmV2ZW50X2xpc3RlbmVyIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudHNXcml0ZVN1YiAiTGlzdGVucyB0byIKICAgIGV2ZW50c1dyaXRlRGVsZWdhdGUgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5ldmVudF9yZXBvc2l0b3J5X2hhbmRsZXIgIkRlbGVnYXRlcyB0byIKICAgIGV2ZW50c0RhdGFkb2dMaXN0ZW5lciA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmV2ZW50X2xpc3RlbmVyIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudHNEYXRhZG9nU3ViICJMaXN0ZW5zIHRvIgogICAgZXZlbnRzSGVjTGlzdGVuZXIgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRzSGVjU3ViICJMaXN0ZW5zIHRvIgogICAgZXZlbnRzU2xhY2tMaXN0ZW5lciA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmV2ZW50X2xpc3RlbmVyIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5ldmVudHNTbGFja1N1YiAiTGlzdGVucyB0byIKICAgIGV2ZW50c1RlYW1zTGlzdGVuZXIgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRzVGVhbXNTdWIgIkxpc3RlbnMgdG8iCiAgICBldmVudHNXZWJob29rTGlzdGVuZXIgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuZXZlbnRzV2ViaG9va1N1YiAiTGlzdGVucyB0byIKICAgIGV2ZW50c0ludGVncmF0aW9uSGFuZGxlckRlbGVnYXRlID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuZXZlbnRfbGlzdGVuZXIgLT4gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuZXZlbnRfaW50ZWdyYXRpb25faGFuZGxlciAiRGVsZWdhdGVzIHRvIgogICAgCiAgICBldmVudEludGVncmF0aW9uSGFuZGxlclB1Ymxpc2ggPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5ldmVudF9pbnRlZ3JhdGlvbl9oYW5kbGVyIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5pbnRlZ3JhdGlvbl90b3BpYyAiUHVibGlzaGVzIFRvIgogICAgZXZlbnRJbnRlZ3JhdGlvbkhhbmRsZXJDYWNoZSA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmV2ZW50X2ludGVncmF0aW9uX2hhbmRsZXIgLT4gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuZXZlbnRfaW50ZWdyYXRpb25zX2V4dGVuZGVkX2NhY2hlICJGZXRjaGVzIGNvbmZpZ3VyYXRpb25zIGZyb20iCiAgICBldmVudEludGVncmF0aW9uSGFuZGxlckRhdGFiYXNlID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuZXZlbnRfaW50ZWdyYXRpb25faGFuZGxlciAtPiBzZXJ2ZXIuZGF0YWJhc2UgIkZldGNoZXMgdGVtcGxhdGUgZGV0YWlscyBmcm9tIgogICAgY2FjaGVEYXRhYmFzZUZldGNoID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuZXZlbnRfaW50ZWdyYXRpb25zX2V4dGVuZGVkX2NhY2hlIC0+IHNlcnZlci5kYXRhYmFzZSAiRmV0Y2hlcyBjb25maWd1cmF0aW9ucyBmcm9tIgogICAgZXZlbnRJbnRlZ3JhdGlvbkhhbmRsZXJGaWx0ZXIgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5ldmVudF9pbnRlZ3JhdGlvbl9oYW5kbGVyIC0+IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmludGVncmF0aW9uX2ZpbHRlcl9zZXJ2aWNlICJSdW5zIGZpbHRlcnMiCiAgICBldmVudFJlcG9zaXRvcnlEYXRhYmFzZSA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmV2ZW50X3JlcG9zaXRvcnlfaGFuZGxlciAtPiBzZXJ2ZXIuZGF0YWJhc2UgICJXcml0ZXMgZXZlbnRzIHRvIgogICAgCiAgICBpbnRlZ3JhdGlvblNsYWNrTGlzdGVuZXIgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5pbnRlZ3JhdGlvbl9saXN0ZW5lciAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuaW50ZWdyYXRpb25TbGFja1N1YiAiTGlzdGVucyB0byIKICAgIGludGVncmF0aW9uU2xhY2tEZWxlZ2F0ZSA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmludGVncmF0aW9uX2xpc3RlbmVyIC0+IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLnNsYWNrX2ludGVncmF0aW9uX2hhbmRsZXIgIkRlbGVnYXRlcyB0byIKICAgIGludGVncmF0aW9uV2ViaG9va0xpc3RlbmVyID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuaW50ZWdyYXRpb25fbGlzdGVuZXIgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmludGVncmF0aW9uV2ViaG9va1N1YiAiTGlzdGVucyB0byIKICAgIGludGVncmF0aW9uV2ViaG9va0RlbGVnYXRlID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuaW50ZWdyYXRpb25fbGlzdGVuZXIgLT4gc2VydmVyLmV2ZW50c19wcm9jZXNzb3Iud2ViaG9va19pbnRlZ3JhdGlvbl9oYW5kbGVyICJEZWxlZ2F0ZXMgdG8iCiAgICBpbnRlZ3JhdGlvbkhlY0xpc3RlbmVyID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuaW50ZWdyYXRpb25fbGlzdGVuZXIgLT4gc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzLmludGVncmF0aW9uSGVjU3ViICJMaXN0ZW5zIHRvIgogICAgaW50ZWdyYXRpb25EYXRhZG9nTGlzdGVuZXIgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5pbnRlZ3JhdGlvbl9saXN0ZW5lciAtPiBzZXJ2ZXIuYXp1cmVfc2VydmljZV9idXMuaW50ZWdyYXRpb25EYXRhZG9nU3ViICJMaXN0ZW5zIHRvIgogICAgaW50ZWdyYXRpb25EYXRhZG9nRGVsZWdhdGUgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5pbnRlZ3JhdGlvbl9saXN0ZW5lciAtPiBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5kYXRhZG9nX2ludGVncmF0aW9uX2hhbmRsZXIgIkRlbGVnYXRlcyB0byIKICAgIGludGVncmF0aW9uVGVhbXNMaXN0ZW5lciA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmludGVncmF0aW9uX2xpc3RlbmVyIC0+IHNlcnZlci5henVyZV9zZXJ2aWNlX2J1cy5pbnRlZ3JhdGlvblRlYW1zU3ViICJMaXN0ZW5zIHRvIgogICAgaW50ZWdyYXRpb25UZWFtc0RlbGVnYXRlID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuaW50ZWdyYXRpb25fbGlzdGVuZXIgLT4gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IudGVhbXNfaW50ZWdyYXRpb25faGFuZGxlciAiRGVsZWdhdGVzIHRvIgogICAgCiAgICAjIFJhYmJpdE1RIGV4Y2hhbmdlcywgcXVldWVzLCBhbmQgcm91dGluZwogICAgZXZlbnRzV3JpdGVRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRfZXhjaGFuZ2UgLT4gc2VydmVyLnJhYmJpdF9tcS5ldmVudHNXcml0ZVF1ZXVlICAiU3Vic2NyaWJlcyB2aWEgZmFuLW91dCIKICAgIGV2ZW50c0RhdGFkb2dRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRfZXhjaGFuZ2UgLT4gc2VydmVyLnJhYmJpdF9tcS5ldmVudHNEYXRhZG9nUXVldWUgIlN1YnNjcmliZXMgdmlhIGZhbi1vdXQiCiAgICBldmVudHNIZWNRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRfZXhjaGFuZ2UgLT4gc2VydmVyLnJhYmJpdF9tcS5ldmVudHNIZWNRdWV1ZSAiU3Vic2NyaWJlcyB2aWEgZmFuLW91dCIKICAgIGV2ZW50c1NsYWNrUXVldWUgPSBzZXJ2ZXIucmFiYml0X21xLmV2ZW50X2V4Y2hhbmdlIC0+IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRzU2xhY2tRdWV1ZSAiU3Vic2NyaWJlcyB2aWEgZmFuLW91dCIKICAgIGV2ZW50c1RlYW1zUXVldWUgPSBzZXJ2ZXIucmFiYml0X21xLmV2ZW50X2V4Y2hhbmdlIC0+IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRzVGVhbXNRdWV1ZSAiU3Vic2NyaWJlcyB2aWEgZmFuLW91dCIKICAgIGV2ZW50c1dlYmhvb2tRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuZXZlbnRfZXhjaGFuZ2UgLT4gc2VydmVyLnJhYmJpdF9tcS5ldmVudHNXZWJob29rUXVldWUgIlN1YnNjcmliZXMgdmlhIGZhbi1vdXQiCiAgICBpbnRlZ3JhdGlvbkRhdGFkb2dRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25fZXhjaGFuZ2UgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvbkRhdGFkb2dRdWV1ZSAiU3Vic2NyaWJlcyB2aWEgZmlsdGVyIG9uIERhdGFkb2cga2V5IgogICAgaW50ZWdyYXRpb25IZWNRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25fZXhjaGFuZ2UgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvbkhlY1F1ZXVlICJTdWJzY3JpYmVzIHZpYSBmaWx0ZXIgb24gSEVDIGtleSIKICAgIGludGVncmF0aW9uU2xhY2tRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25fZXhjaGFuZ2UgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvblNsYWNrUXVldWUgIlN1YnNjcmliZXMgdmlhIGZpbHRlciBvbiBTbGFjayBrZXkiCiAgICBpbnRlZ3JhdGlvblRlYW1zUXVldWUgPSBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uX2V4Y2hhbmdlIC0+IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25UZWFtc1F1ZXVlICJTdWJzY3JpYmVzIHZpYSBmaWx0ZXIgb24gVGVhbXMga2V5IgogICAgaW50ZWdyYXRpb25XZWJob29rUXVldWUgPSBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uX2V4Y2hhbmdlIC0+IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25XZWJob29rUXVldWUgIlN1YnNjcmliZXMgdmlhIGZpbHRlciBvbiBXZWJob29rIGtleSIKICAgIGludGVncmF0aW9uRGF0YWRvZ1JldHJ5UXVldWUgPSBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uRGF0YWRvZ1JldHJ5UXVldWUgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvbkRhdGFkb2dRdWV1ZSAiRExRIGFmdGVyIGNvbmZpZ3VyZWQgcmV0cnkgdGltaW5nIgogICAgaW50ZWdyYXRpb25IZWNSZXRyeVF1ZXVlID0gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvbkhlY1JldHJ5UXVldWUgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvbkhlY1F1ZXVlICJETFEgYWZ0ZXIgY29uZmlndXJlZCByZXRyeSB0aW1pbmciCiAgICBpbnRlZ3JhdGlvblNsYWNrUmV0cnlRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25TbGFja1JldHJ5UXVldWUgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvblNsYWNrUXVldWUgIkRMUSBhZnRlciBjb25maWd1cmVkIHJldHJ5IHRpbWluZyIKICAgIGludGVncmF0aW9uVGVhbXNSZXRyeVF1ZXVlID0gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvblRlYW1zUmV0cnlRdWV1ZSAtPiBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uVGVhbXNRdWV1ZSAiRExRIGFmdGVyIGNvbmZpZ3VyZWQgcmV0cnkgdGltaW5nIgogICAgaW50ZWdyYXRpb25XZWJob29rUmV0cnlRdWV1ZSA9IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25XZWJob29rUmV0cnlRdWV1ZSAtPiBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uV2ViaG9va1F1ZXVlICJETFEgYWZ0ZXIgY29uZmlndXJlZCByZXRyeSB0aW1pbmciCiAgICAKICAgIGV2ZW50c1dyaXRlTGlzdGVuZXJfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIucmFiYml0X21xLmV2ZW50c1dyaXRlUXVldWUgIkxpc3RlbnMgdG8iCiAgICBldmVudHNEYXRhZG9nTGlzdGVuZXJfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIucmFiYml0X21xLmV2ZW50c0RhdGFkb2dRdWV1ZSAiTGlzdGVucyB0byIKICAgIGV2ZW50c0hlY0xpc3RlbmVyX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuZXZlbnRfbGlzdGVuZXIgLT4gc2VydmVyLnJhYmJpdF9tcS5ldmVudHNIZWNRdWV1ZSAiTGlzdGVucyB0byIKICAgIGV2ZW50c1NsYWNrTGlzdGVuZXJfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIucmFiYml0X21xLmV2ZW50c1NsYWNrUXVldWUgIkxpc3RlbnMgdG8iCiAgICBldmVudHNUZWFtc0xpc3RlbmVyX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuZXZlbnRfbGlzdGVuZXIgLT4gc2VydmVyLnJhYmJpdF9tcS5ldmVudHNUZWFtc1F1ZXVlICJMaXN0ZW5zIHRvIgogICAgZXZlbnRzV2ViaG9va0xpc3RlbmVyX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuZXZlbnRfbGlzdGVuZXIgLT4gc2VydmVyLnJhYmJpdF9tcS5ldmVudHNXZWJob29rUXVldWUgIkxpc3RlbnMgdG8iCiAgICBldmVudHNXcml0ZURlbGVnYXRlX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuZXZlbnRfbGlzdGVuZXIgLT4gc2VydmVyLmV2ZW50cy5ldmVudF9yZXBvc2l0b3J5X2hhbmRsZXIgIkRlbGVnYXRlcyB0byIKICAgIAogICAgZXZlbnRSZXBvc2l0b3J5RGF0YWJhc2VfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9yZXBvc2l0b3J5X2hhbmRsZXIgLT4gc2VydmVyLmRhdGFiYXNlICJXcml0ZXMgZXZlbnRzIHRvIiB0YWdzICJTZWxmLUhvc3RlZC1Pbmx5IgogICAgZXZlbnRzSW50ZWdyYXRpb25IYW5kbGVyRGVsZWdhdGVfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9saXN0ZW5lciAtPiBzZXJ2ZXIuZXZlbnRzLmV2ZW50X2ludGVncmF0aW9uX2hhbmRsZXIgIkRlbGVnYXRlcyB0byIKICAgIGV2ZW50SW50ZWdyYXRpb25IYW5kbGVyRGF0YWJhc2VfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9pbnRlZ3JhdGlvbl9oYW5kbGVyIC0+IHNlcnZlci5kYXRhYmFzZSAiRmV0Y2hlcyB0ZW1wbGF0ZSBkZXRhaWxzIGZyb20iCiAgICBjYWNoZURhdGFiYXNlRmV0Y2hfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9pbnRlZ3JhdGlvbnNfZXh0ZW5kZWRfY2FjaGUgLT4gc2VydmVyLmRhdGFiYXNlICJGZXRjaGVzIGNvbmZpZ3VyYXRpb25zIGZyb20iIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICBldmVudEludGVncmF0aW9uSGFuZGxlckNhY2hlX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuZXZlbnRfaW50ZWdyYXRpb25faGFuZGxlciAtPiBzZXJ2ZXIuZXZlbnRzLmV2ZW50X2ludGVncmF0aW9uc19leHRlbmRlZF9jYWNoZSAiRmV0Y2hlcyBjb25maWd1cmF0aW9ucyBmcm9tIgogICAgZXZlbnRJbnRlZ3JhdGlvbkhhbmRsZXJGaWx0ZXJfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5ldmVudF9pbnRlZ3JhdGlvbl9oYW5kbGVyIC0+IHNlcnZlci5ldmVudHMuaW50ZWdyYXRpb25fZmlsdGVyX3NlcnZpY2UgIlJ1bnMgZmlsdGVycyIKICAgIGV2ZW50SW50ZWdyYXRpb25IYW5kbGVyUHVibGlzaF9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLmV2ZW50X2ludGVncmF0aW9uX2hhbmRsZXIgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvbl9leGNoYW5nZSAiUHVibGlzaGVzIFRvIgogICAgCiAgICBpbnRlZ3JhdGlvblNsYWNrTGlzdGVuZXJfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5pbnRlZ3JhdGlvbl9saXN0ZW5lciAtPiBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uU2xhY2tRdWV1ZSAiTGlzdGVucyB0byIKICAgIGludGVncmF0aW9uV2ViaG9va0xpc3RlbmVyX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuaW50ZWdyYXRpb25fbGlzdGVuZXIgLT4gc2VydmVyLnJhYmJpdF9tcS5pbnRlZ3JhdGlvbldlYmhvb2tRdWV1ZSAiTGlzdGVucyB0byIKICAgIGludGVncmF0aW9uSGVjTGlzdGVuZXJfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5pbnRlZ3JhdGlvbl9saXN0ZW5lciAtPiBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uSGVjUXVldWUgIkxpc3RlbnMgdG8iCiAgICBpbnRlZ3JhdGlvbkRhdGFkb2dMaXN0ZW5lcl9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLmludGVncmF0aW9uX2xpc3RlbmVyIC0+IHNlcnZlci5yYWJiaXRfbXEuaW50ZWdyYXRpb25EYXRhZG9nUXVldWUgIkxpc3RlbnMgdG8iCiAgICBpbnRlZ3JhdGlvblRlYW1zTGlzdGVuZXJfZXZlbnRzID0gc2VydmVyLmV2ZW50cy5pbnRlZ3JhdGlvbl9saXN0ZW5lciAtPiBzZXJ2ZXIucmFiYml0X21xLmludGVncmF0aW9uVGVhbXNRdWV1ZSAiTGlzdGVucyB0byIKICAgIGludGVncmF0aW9uU2xhY2tEZWxlZ2F0ZV9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLmludGVncmF0aW9uX2xpc3RlbmVyIC0+IHNlcnZlci5ldmVudHMuc2xhY2tfaW50ZWdyYXRpb25faGFuZGxlciAiRGVsZWdhdGVzIHRvIgogICAgaW50ZWdyYXRpb25UZWFtc0RlbGVnYXRlX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuaW50ZWdyYXRpb25fbGlzdGVuZXIgLT4gc2VydmVyLmV2ZW50cy50ZWFtc19pbnRlZ3JhdGlvbl9oYW5kbGVyICJEZWxlZ2F0ZXMgdG8iCiAgICBpbnRlZ3JhdGlvbkRhdGFkb2dEZWxlZ2F0ZV9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLmludGVncmF0aW9uX2xpc3RlbmVyIC0+IHNlcnZlci5ldmVudHMuZGF0YWRvZ19pbnRlZ3JhdGlvbl9oYW5kbGVyICJEZWxlZ2F0ZXMgdG8iCiAgICBpbnRlZ3JhdGlvbldlYmhvb2tEZWxlZ2F0ZV9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLmludGVncmF0aW9uX2xpc3RlbmVyIC0+IHNlcnZlci5ldmVudHMud2ViaG9va19pbnRlZ3JhdGlvbl9oYW5kbGVyICJEZWxlZ2F0ZXMgdG8iCiAgICAKICAgICMgRXh0ZXJuYWwgU2VydmljZXMKICAgIHNsYWNrVG9TbGFja1NlcnZpY2UgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5zbGFja19pbnRlZ3JhdGlvbl9oYW5kbGVyIC0+IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLnNsYWNrX3NlcnZpY2UgIlVzZXMiCiAgICBzbGFja1NlcnZpY2VUb1NsYWNrID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3Iuc2xhY2tfc2VydmljZSAgLT4gZXh0ZXJuYWxfc2VydmljZXMuc2xhY2sgIlB1Ymxpc2hlcyBjb25maWd1cmVkIGV2ZW50cyB0byIKICAgIHRlYW1zVG9UZWFtc1NlcnZpY2UgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci50ZWFtc19pbnRlZ3JhdGlvbl9oYW5kbGVyIC0+IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLnRlYW1zX3NlcnZpY2UgIlVzZXMiCiAgICB0ZWFtc1NlcnZpY2VUb1RlYW1zID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IudGVhbXNfc2VydmljZSAgLT4gZXh0ZXJuYWxfc2VydmljZXMudGVhbXMgIlB1Ymxpc2hlcyBjb25maWd1cmVkIGV2ZW50cyB0byIKICAgIHdlYmhvb2toYW5kbGVySHR0cENsaWVudCA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLndlYmhvb2tfaW50ZWdyYXRpb25faGFuZGxlciAtPiBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5odHRwX2NsaWVudCAiVXNlcyIKICAgIGRhdGFkb2doYW5kbGVySHR0cENsaWVudCA9IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yLmRhdGFkb2dfaW50ZWdyYXRpb25faGFuZGxlciAtPiBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5odHRwX2NsaWVudCAiVXNlcyIKICAgIGh0dHBUb0Nyb3dkc3RyaWtlID0gc2VydmVyLmV2ZW50c19wcm9jZXNzb3IuaHR0cF9jbGllbnQgLT4gZXh0ZXJuYWxfc2VydmljZXMuY3Jvd2RzdHJpa2UgIlB1Ymxpc2hlcyBjb25maWd1cmVkIGV2ZW50cyB0byIKICAgIGh0dHBUb0RhdGFkb2cgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5odHRwX2NsaWVudCAtPiBleHRlcm5hbF9zZXJ2aWNlcy5kYXRhZG9nICJQdWJsaXNoZXMgY29uZmlndXJlZCBldmVudHMgdG8iCiAgICBodHRwVG9TcGx1bmsgPSBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3Nvci5odHRwX2NsaWVudCAtPiBleHRlcm5hbF9zZXJ2aWNlcy5zcGx1bmsgIlB1Ymxpc2hlcyBjb25maWd1cmVkIGV2ZW50cyB0byIKICAgIAogICAgc2xhY2tUb1NsYWNrU2VydmljZV9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLnNsYWNrX2ludGVncmF0aW9uX2hhbmRsZXIgLT4gc2VydmVyLmV2ZW50cy5zbGFja19zZXJ2aWNlICJVc2VzIiB0YWdzICJTZWxmLUhvc3RlZC1Pbmx5IgogICAgc2xhY2tTZXJ2aWNlVG9TbGFja19ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLnNsYWNrX3NlcnZpY2UgIC0+IGV4dGVybmFsX3NlcnZpY2VzLnNsYWNrICJQdWJsaXNoZXMgY29uZmlndXJlZCBldmVudHMgdG8iIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICB0ZWFtc1RvVGVhbXNTZXJ2aWNlX2V2ZW50cyA9IHNlcnZlci5ldmVudHMudGVhbXNfaW50ZWdyYXRpb25faGFuZGxlciAtPiBzZXJ2ZXIuZXZlbnRzLnRlYW1zX3NlcnZpY2UgIlVzZXMiIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICB0ZWFtc1NlcnZpY2VUb1RlYW1zX2V2ZW50cyA9IHNlcnZlci5ldmVudHMudGVhbXNfc2VydmljZSAgLT4gZXh0ZXJuYWxfc2VydmljZXMudGVhbXMgIlB1Ymxpc2hlcyBjb25maWd1cmVkIGV2ZW50cyB0byIgdGFncyAiU2VsZi1Ib3N0ZWQtT25seSIKICAgIHdlYmhvb2toYW5kbGVySHR0cENsaWVudF9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLndlYmhvb2tfaW50ZWdyYXRpb25faGFuZGxlciAtPiBzZXJ2ZXIuZXZlbnRzLmh0dHBfY2xpZW50ICJVc2VzIiB0YWdzICJTZWxmLUhvc3RlZC1Pbmx5IgogICAgZGF0YWRvZ2hhbmRsZXJIdHRwQ2xpZW50X2V2ZW50cyA9IHNlcnZlci5ldmVudHMuZGF0YWRvZ19pbnRlZ3JhdGlvbl9oYW5kbGVyIC0+IHNlcnZlci5ldmVudHMuaHR0cF9jbGllbnQgIlVzZXMiIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICBodHRwVG9Dcm93ZHN0cmlrZV9ldmVudHMgPSBzZXJ2ZXIuZXZlbnRzLmh0dHBfY2xpZW50IC0+IGV4dGVybmFsX3NlcnZpY2VzLmNyb3dkc3RyaWtlICJQdWJsaXNoZXMgY29uZmlndXJlZCBldmVudHMgdG8iIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICBodHRwVG9EYXRhZG9nX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuaHR0cF9jbGllbnQgLT4gZXh0ZXJuYWxfc2VydmljZXMuZGF0YWRvZyAiUHVibGlzaGVzIGNvbmZpZ3VyZWQgZXZlbnRzIHRvIiB0YWdzICJTZWxmLUhvc3RlZC1Pbmx5IgogICAgaHR0cFRvU3BsdW5rX2V2ZW50cyA9IHNlcnZlci5ldmVudHMuaHR0cF9jbGllbnQgLT4gZXh0ZXJuYWxfc2VydmljZXMuc3BsdW5rICJQdWJsaXNoZXMgY29uZmlndXJlZCBldmVudHMgdG8iIHRhZ3MgIlNlbGYtSG9zdGVkLU9ubHkiCiAgICBrZXlfY29ubmVjdG9yIC0+IHNlcnZlci5pZGVudGl0eSAiVmFsaWRhdGVzIEpXVHMgd2l0aCIKICB9CgogIHZpZXdzIHsKICAgIHN0eWxlcyB7CiAgICAgIGVsZW1lbnQgIlBlcnNvbiIgewogICAgICAgIGJhY2tncm91bmQgIzMxMDdkMwogICAgICAgIHNoYXBlIHBlcnNvbgogICAgICB9CiAgICAgIGVsZW1lbnQgIk1TUCIgewogICAgICAgIGJhY2tncm91bmQgIzMxMDdkMwogICAgICAgIHNoYXBlIHBlcnNvbgogICAgICB9CiAgICB9CiAgICBjb21wb25lbnQgc2VydmVyLmF6dXJlX3NlcnZpY2VfYnVzICJBenVyZV9TZXJ2aWNlX0J1cyIgewogICAgICAgIGluY2x1ZGUgKgogICAgfQogICAgCiAgICBjb21wb25lbnQgc2VydmVyLnJhYmJpdF9tcSAiUmFiYml0TVEiIHsKICAgICAgICBpbmNsdWRlICoKICAgIH0KICAgIAogICAgY29tcG9uZW50IHNlcnZlci5ldmVudHNfcHJvY2Vzc29yICJFdmVudHNfUHJvY2Vzc29yIiB7CiAgICAgICAgaW5jbHVkZSAqCiAgICB9CiAgICAKICAgIGNvbXBvbmVudCBzZXJ2ZXIuZXZlbnRzICJFdmVudHMiIHsKICAgICAgICBpbmNsdWRlICoKICAgIH0KICAgIAogICAgZHluYW1pYyBzZXJ2ZXIuZXZlbnRzX3Byb2Nlc3NvciAiRXZlbnRzX1Byb2Nlc3Nvcl9BenVyZV9TZXJ2aWNlX0J1cyIgIkV2ZW50IEludGVncmF0aW9ucyAvIEFTQiBEZXRhaWwiIHsKICAgICAgICBldmVudHNXcml0ZVN1YgogICAgICAgIGV2ZW50c0hlY1N1YgogICAgICAgIGV2ZW50c1NsYWNrU3ViCiAgICAgICAgZXZlbnRzV2ViaG9va1N1YgogICAgICAgIGV2ZW50c1dyaXRlTGlzdGVuZXIKICAgICAgICBldmVudHNIZWNMaXN0ZW5lcgogICAgICAgIGV2ZW50c1NsYWNrTGlzdGVuZXIKICAgICAgICBldmVudHNXZWJob29rTGlzdGVuZXIKICAgICAgICBldmVudHNXcml0ZURlbGVnYXRlCiAgICAgICAgZXZlbnRSZXBvc2l0b3J5RGF0YWJhc2UKICAgICAgICBldmVudHNJbnRlZ3JhdGlvbkhhbmRsZXJEZWxlZ2F0ZQogICAgICAgIGV2ZW50SW50ZWdyYXRpb25IYW5kbGVyRGF0YWJhc2UKICAgICAgICBldmVudEludGVncmF0aW9uSGFuZGxlckNhY2hlCiAgICAgICAgY2FjaGVEYXRhYmFzZUZldGNoCiAgICAgICAgZXZlbnRJbnRlZ3JhdGlvbkhhbmRsZXJGaWx0ZXIKICAgICAgICBldmVudEludGVncmF0aW9uSGFuZGxlclB1Ymxpc2gKICAgICAgICBpbnRlZ3JhdGlvblNsYWNrU3ViCiAgICAgICAgaW50ZWdyYXRpb25UZWFtc1N1YgogICAgICAgIGludGVncmF0aW9uRGF0YWRvZ1N1YgogICAgICAgIGludGVncmF0aW9uV2ViaG9va1N1YgogICAgICAgIGludGVncmF0aW9uSGVjU3ViCiAgICAgICAgaW50ZWdyYXRpb25TbGFja0xpc3RlbmVyCiAgICAgICAgaW50ZWdyYXRpb25UZWFtc0xpc3RlbmVyCiAgICAgICAgaW50ZWdyYXRpb25EYXRhZG9nTGlzdGVuZXIKICAgICAgICBpbnRlZ3JhdGlvbldlYmhvb2tMaXN0ZW5lcgogICAgICAgIGludGVncmF0aW9uSGVjTGlzdGVuZXIKICAgICAgICBpbnRlZ3JhdGlvblNsYWNrRGVsZWdhdGUKICAgICAgICBpbnRlZ3JhdGlvblRlYW1zRGVsZWdhdGUKICAgICAgICBpbnRlZ3JhdGlvbkRhdGFkb2dEZWxlZ2F0ZQogICAgICAgIGludGVncmF0aW9uV2ViaG9va0RlbGVnYXRlCiAgICAgICAgc2xhY2tUb1NsYWNrU2VydmljZQogICAgICAgIHNsYWNrU2VydmljZVRvU2xhY2sKICAgICAgICB0ZWFtc1RvVGVhbXNTZXJ2aWNlCiAgICAgICAgdGVhbXNTZXJ2aWNlVG9UZWFtcwogICAgICAgIGRhdGFkb2dIYW5kbGVySHR0cENsaWVudAogICAgICAgIHdlYmhvb2tIYW5kbGVySHR0cENsaWVudAogICAgICAgIGh0dHBUb0RhdGFkb2cKICAgICAgICBodHRwVG9Dcm93ZHN0cmlrZQogICAgICAgIGh0dHBUb1NwbHVuawogICAgfQogICAgCiAgICBkeW5hbWljIHNlcnZlci5ldmVudHMgIkV2ZW50c19SYWJiaXRNUSIgIkV2ZW50IEludGVncmF0aW9ucyAvIFJhYmJpdE1RIERldGFpbCIgewogICAgICAgIGV2ZW50c1dyaXRlUXVldWUKICAgICAgICBldmVudHNIZWNRdWV1ZQogICAgICAgIGV2ZW50c1NsYWNrUXVldWUKICAgICAgICBldmVudHNXZWJob29rUXVldWUKICAgICAgICBldmVudHNXcml0ZUxpc3RlbmVyX2V2ZW50cwogICAgICAgIGV2ZW50c0hlY0xpc3RlbmVyX2V2ZW50cwogICAgICAgIGV2ZW50c1NsYWNrTGlzdGVuZXJfZXZlbnRzCiAgICAgICAgZXZlbnRzV2ViaG9va0xpc3RlbmVyX2V2ZW50cwogICAgICAgIGV2ZW50c1dyaXRlRGVsZWdhdGVfZXZlbnRzCiAgICAgICAgZXZlbnRSZXBvc2l0b3J5RGF0YWJhc2VfZXZlbnRzCiAgICAgICAgZXZlbnRzSW50ZWdyYXRpb25IYW5kbGVyRGVsZWdhdGVfZXZlbnRzCiAgICAgICAgZXZlbnRJbnRlZ3JhdGlvbkhhbmRsZXJEYXRhYmFzZV9ldmVudHMKICAgICAgICBldmVudEludGVncmF0aW9uSGFuZGxlckNhY2hlX2V2ZW50cwogICAgICAgIGNhY2hlRGF0YWJhc2VGZXRjaF9ldmVudHMKICAgICAgICBldmVudEludGVncmF0aW9uSGFuZGxlckZpbHRlcl9ldmVudHMKICAgICAgICBldmVudEludGVncmF0aW9uSGFuZGxlclB1Ymxpc2hfZXZlbnRzCiAgICAgICAgaW50ZWdyYXRpb25TbGFja1F1ZXVlCiAgICAgICAgaW50ZWdyYXRpb25XZWJob29rUXVldWUKICAgICAgICBpbnRlZ3JhdGlvbkhlY1F1ZXVlCiAgICAgICAgaW50ZWdyYXRpb25UZWFtc1F1ZXVlCiAgICAgICAgaW50ZWdyYXRpb25EYXRhZG9nUXVldWUKICAgICAgICBpbnRlZ3JhdGlvblNsYWNrTGlzdGVuZXJfZXZlbnRzCiAgICAgICAgaW50ZWdyYXRpb25UZWFtc0xpc3RlbmVyX2V2ZW50cwogICAgICAgIGludGVncmF0aW9uRGF0YWRvZ0xpc3RlbmVyX2V2ZW50cwogICAgICAgIGludGVncmF0aW9uV2ViaG9va0xpc3RlbmVyX2V2ZW50cwogICAgICAgIGludGVncmF0aW9uSGVjTGlzdGVuZXJfZXZlbnRzCiAgICAgICAgaW50ZWdyYXRpb25TbGFja0RlbGVnYXRlX2V2ZW50cwogICAgICAgIGludGVncmF0aW9uVGVhbXNEZWxlZ2F0ZV9ldmVudHMKICAgICAgICBpbnRlZ3JhdGlvbkRhdGFkb2dEZWxlZ2F0ZV9ldmVudHMKICAgICAgICBpbnRlZ3JhdGlvbldlYmhvb2tEZWxlZ2F0ZV9ldmVudHMKICAgICAgICBzbGFja1RvU2xhY2tTZXJ2aWNlX2V2ZW50cwogICAgICAgIHNsYWNrU2VydmljZVRvU2xhY2tfZXZlbnRzCiAgICAgICAgdGVhbXNUb1RlYW1zU2VydmljZV9ldmVudHMKICAgICAgICB0ZWFtc1NlcnZpY2VUb1RlYW1zX2V2ZW50cwogICAgICAgIHdlYmhvb2tIYW5kbGVySHR0cENsaWVudF9ldmVudHMKICAgICAgICBkYXRhZG9nSGFuZGxlckh0dHBDbGllbnRfZXZlbnRzCiAgICAgICAgaHR0cFRvRGF0YWRvZ19ldmVudHMKICAgICAgICBodHRwVG9Dcm93ZHN0cmlrZV9ldmVudHMKICAgICAgICBodHRwVG9TcGx1bmtfZXZlbnRzCiAgICB9CiAgICBjb21wb25lbnQgc2VydmVyLmljb25zICJpY29uc19zZXJ2aWNlIiB7CiAgICAgIGluY2x1ZGUgKgogICAgfQoKICAgIHN5c3RlbUxhbmRzY2FwZSAiQml0d2FyZGVuIiB7CiAgICAgIGluY2x1ZGUgKgogICAgfQoKICAgIGNvbnRhaW5lciBzZXJ2ZXIgIkJpdHdhcmRlbl9TZXJ2ZXIiIHsKICAgICAgaW5jbHVkZSAqCiAgICB9CgogICAgZmlsdGVyZWQgQml0d2FyZGVuX1NlcnZlciBleGNsdWRlICJTZWxmLUhvc3RlZC1Pbmx5IiAiQ2xvdWQiCiAgICBmaWx0ZXJlZCBCaXR3YXJkZW5fU2VydmVyIGV4Y2x1ZGUgIkNsb3VkLU9ubHkiICJTZWxmLUhvc3RlZCIKCiAgICAvLyBUaGlzIGlzIGxhc3QgdG8gb3ZlcnJpZGUgdGVhbSBzdHlsZXMgd2l0aCBjb21tb24gc3R5bGVzCiAgICBzdHlsZXMgewogICAgICB0aGVtZSBkZWZhdWx0CiAgICAgIGVsZW1lbnQgIkVsZW1lbnQiIHsKICAgICAgICBjb2xvciAjM2MzYjNiCiAgICAgIH0KICAgICAgZWxlbWVudCAiUGVyc29uIiB7CiAgICAgICAgYmFja2dyb3VuZCAjZDM0NDA3CiAgICAgICAgc2hhcGUgcGVyc29uCiAgICAgIH0KICAgICAgZWxlbWVudCAiQ29udGFpbmVyIiB7CiAgICAgICAgYmFja2dyb3VuZCAjZjg4NzI4CiAgICAgIH0KICAgICAgZWxlbWVudCAiTVNQIiB7CiAgICAgICAgYmFja2dyb3VuZCAjMzEwN2QzCiAgICAgIH0KICAgICAgZWxlbWVudCAiUXVldWUiIHsKICAgICAgICBzaGFwZSBwaXBlCiAgICAgIH0KICAgICAgZWxlbWVudCAiTW9iaWxlIiB7CiAgICAgICAgc2hhcGUgbW9iaWxlRGV2aWNlUG9ydHJhaXQKICAgICAgfQogICAgICBlbGVtZW50ICJXZWIiIHsKICAgICAgICBzaGFwZSB3ZWJCcm93c2VyCiAgICAgIH0KICAgICAgZWxlbWVudCAiRGF0YWJhc2UiIHsKICAgICAgICBzaGFwZSBjeWxpbmRlcgogICAgICB9CiAgICAgIGVsZW1lbnQgIkV4dGVybmFsIiB7CiAgICAgICAgY29sb3IgIzAwMDAwMAogICAgICAgIGJhY2tncm91bmQgI2I1YjViNQogICAgICB9CiAgICB9CiAgfQp9" }, "views" : { "componentViews" : [ { - "containerId" : "34", + "containerId" : "33", + "dimensions" : { + "height" : 2921, + "width" : 3875 + }, + "elements" : [ { + "id" : "5", + "x" : 1031, + "y" : 165 + }, { + "id" : "7", + "x" : 1561, + "y" : 165 + }, { + "id" : "10", + "x" : 199, + "y" : 1585 + }, { + "id" : "26", + "x" : 2101, + "y" : 165 + }, { + "id" : "29", + "x" : 341, + "y" : 165 + }, { + "id" : "30", + "x" : 2656, + "y" : 165 + }, { + "id" : "34", + "x" : 1721, + "y" : 575 + }, { + "id" : "35", + "x" : 1744, + "y" : 1585 + }, { + "id" : "36", + "x" : 789, + "y" : 1010 + }, { + "id" : "37", + "x" : 2235, + "y" : 995 + }, { + "id" : "38", + "x" : 3199, + "y" : 1010 + }, { + "id" : "39", + "x" : 1753, + "y" : 1000 + }, { + "id" : "40", + "x" : 1271, + "y" : 1005 + }, { + "id" : "41", + "x" : 2717, + "y" : 1005 + }, { + "id" : "42", + "x" : 2017, + "y" : 2240 + }, { + "id" : "43", + "x" : 3200, + "y" : 2240 + }, { + "id" : "44", + "x" : 1426, + "y" : 2240 + }, { + "id" : "45", + "x" : 835, + "y" : 2240 + }, { + "id" : "46", + "x" : 2608, + "y" : 2240 + } ], + "externalContainerBoundariesVisible" : false, + "key" : "Azure_Service_Bus", + "order" : 1, + "relationships" : [ { + "id" : "153" + }, { + "id" : "175" + }, { + "id" : "177" + }, { + "id" : "179", + "position" : 10, + "vertices" : [ { + "x" : 1026, + "y" : 620 + } ] + }, { + "id" : "181" + }, { + "id" : "183" + }, { + "id" : "195" + }, { + "id" : "196" + }, { + "id" : "197" + }, { + "id" : "198" + }, { + "id" : "199" + }, { + "id" : "200" + }, { + "id" : "201" + }, { + "id" : "202" + }, { + "id" : "203" + }, { + "id" : "204" + }, { + "id" : "205" + }, { + "id" : "208", + "vertices" : [ { + "x" : 1019, + "y" : 1415 + } ] + }, { + "id" : "212", + "vertices" : [ { + "x" : 1484, + "y" : 1415 + } ] + }, { + "id" : "214", + "vertices" : [ { + "x" : 2009, + "y" : 1375 + } ] + }, { + "id" : "216", + "vertices" : [ { + "x" : 2474, + "y" : 1365 + } ] + }, { + "id" : "218", + "vertices" : [ { + "x" : 2969, + "y" : 1385 + } ] + }, { + "id" : "220", + "vertices" : [ { + "x" : 3439, + "y" : 1415 + } ] + }, { + "id" : "224" + }, { + "id" : "233", + "position" : 15, + "vertices" : [ { + "x" : 465, + "y" : 2680 + }, { + "x" : 2245, + "y" : 2675 + } ] + }, { + "id" : "236", + "position" : 15, + "vertices" : [ { + "x" : 370, + "y" : 2750 + }, { + "x" : 3440, + "y" : 2755 + } ] + }, { + "id" : "239", + "position" : 15, + "vertices" : [ { + "x" : 495, + "y" : 2635 + }, { + "x" : 1655, + "y" : 2645 + } ] + }, { + "id" : "241", + "position" : 25, + "vertices" : [ { + "x" : 545, + "y" : 2445 + } ] + }, { + "id" : "244", + "position" : 15, + "vertices" : [ { + "x" : 415, + "y" : 2720 + }, { + "x" : 2840, + "y" : 2710 + } ] + } ] + }, { + "containerId" : "47", + "dimensions" : { + "height" : 3096, + "width" : 3935 + }, + "elements" : [ { + "id" : "5", + "x" : 1688, + "y" : 165 + }, { + "id" : "7", + "x" : 180, + "y" : 1500 + }, { + "id" : "26", + "x" : 3035, + "y" : 165 + }, { + "id" : "29", + "x" : 1015, + "y" : 165 + }, { + "id" : "30", + "x" : 2361, + "y" : 165 + }, { + "id" : "48", + "x" : 2025, + "y" : 615 + }, { + "id" : "49", + "x" : 2025, + "y" : 1520 + }, { + "id" : "50", + "x" : 3225, + "y" : 1010 + }, { + "id" : "51", + "x" : 1752, + "y" : 1010 + }, { + "id" : "52", + "x" : 2734, + "y" : 1010 + }, { + "id" : "53", + "x" : 1261, + "y" : 1010 + }, { + "id" : "54", + "x" : 770, + "y" : 1010 + }, { + "id" : "55", + "x" : 2243, + "y" : 1010 + }, { + "id" : "56", + "x" : 1536, + "y" : 2205 + }, { + "id" : "57", + "x" : 2108, + "y" : 2205 + }, { + "id" : "58", + "x" : 2680, + "y" : 2205 + }, { + "id" : "59", + "x" : 964, + "y" : 2205 + }, { + "id" : "60", + "x" : 3254, + "y" : 2205 + }, { + "id" : "61", + "x" : 1536, + "y" : 2645 + }, { + "id" : "62", + "x" : 2108, + "y" : 2645 + }, { + "id" : "63", + "x" : 2680, + "y" : 2645 + }, { + "id" : "64", + "x" : 964, + "y" : 2645 + }, { + "id" : "65", + "x" : 3254, + "y" : 2645 + } ], + "externalContainerBoundariesVisible" : false, + "key" : "RabbitMQ", + "order" : 2, + "relationships" : [ { + "id" : "153" + }, { + "id" : "185" + }, { + "id" : "187", + "vertices" : [ { + "x" : 404, + "y" : 760 + } ] + }, { + "id" : "189" + }, { + "id" : "191" + }, { + "id" : "193" + }, { + "id" : "246" + }, { + "id" : "247" + }, { + "id" : "248" + }, { + "id" : "249" + }, { + "id" : "250" + }, { + "id" : "251" + }, { + "id" : "252", + "position" : 45 + }, { + "id" : "253", + "position" : 45 + }, { + "id" : "254", + "position" : 45 + }, { + "id" : "255", + "position" : 45 + }, { + "id" : "256", + "position" : 45 + }, { + "id" : "257" + }, { + "id" : "258" + }, { + "id" : "259" + }, { + "id" : "260" + }, { + "id" : "261" + }, { + "id" : "264", + "vertices" : [ { + "x" : 3465, + "y" : 1350 + } ] + }, { + "id" : "266", + "vertices" : [ { + "x" : 1005, + "y" : 1410 + } ] + }, { + "id" : "268", + "vertices" : [ { + "x" : 1485, + "y" : 1370 + } ] + }, { + "id" : "270", + "vertices" : [ { + "x" : 1990, + "y" : 1365 + } ] + }, { + "id" : "272", + "vertices" : [ { + "x" : 2470, + "y" : 1365 + } ] + }, { + "id" : "274", + "vertices" : [ { + "x" : 2960, + "y" : 1370 + } ] + }, { + "id" : "285" + }, { + "id" : "288" + }, { + "id" : "290", + "position" : 10, + "vertices" : [ { + "x" : 555, + "y" : 2105 + }, { + "x" : 2360, + "y" : 2120 + } ] + }, { + "id" : "292", + "position" : 10, + "vertices" : [ { + "x" : 455, + "y" : 2130 + }, { + "x" : 2900, + "y" : 2145 + } ] + }, { + "id" : "294", + "vertices" : [ { + "x" : 910, + "y" : 2290 + } ] + }, { + "id" : "296", + "position" : 5, + "vertices" : [ { + "x" : 485, + "y" : 2150 + }, { + "x" : 3475, + "y" : 2170 + } ] + } ] + }, { + "containerId" : "10", + "dimensions" : { + "height" : 2310, + "width" : 4137 + }, + "elements" : [ { + "id" : "11", + "x" : 627, + "y" : 1775 + }, { + "id" : "33", + "x" : 1671, + "y" : 165 + }, { + "id" : "66", + "x" : 220, + "y" : 888 + }, { + "id" : "67", + "x" : 792, + "y" : 510 + }, { + "id" : "68", + "x" : 2647, + "y" : 510 + }, { + "id" : "69", + "x" : 800, + "y" : 888 + }, { + "id" : "70", + "x" : 2017, + "y" : 958 + }, { + "id" : "71", + "x" : 2500, + "y" : 958 + }, { + "id" : "72", + "x" : 2983, + "y" : 958 + }, { + "id" : "73", + "x" : 3467, + "y" : 958 + }, { + "id" : "74", + "x" : 1050, + "y" : 1360 + }, { + "id" : "75", + "x" : 2025, + "y" : 1335 + }, { + "id" : "76", + "x" : 2520, + "y" : 1338 + }, { + "id" : "77", + "x" : 3250, + "y" : 1350 + }, { + "id" : "78", + "x" : 1380, + "y" : 1045 + }, { + "id" : "92", + "x" : 2800, + "y" : 1775 + } ], + "externalContainerBoundariesVisible" : false, + "key" : "Events_Processor", + "order" : 3, + "relationships" : [ { + "id" : "207" + }, { + "id" : "210" + }, { + "id" : "221" + }, { + "id" : "223" + }, { + "id" : "225" + }, { + "id" : "226" + }, { + "id" : "228", + "vertices" : [ { + "x" : 1275, + "y" : 1930 + } ] + }, { + "id" : "229", + "vertices" : [ { + "x" : 1470, + "y" : 1010 + } ] + }, { + "id" : "230" + }, { + "id" : "232" + }, { + "id" : "234" + }, { + "id" : "237" + }, { + "id" : "242" + }, { + "id" : "245" + }, { + "id" : "301" + }, { + "id" : "303", + "vertices" : [ { + "x" : 2250, + "y" : 1935 + } ] + }, { + "id" : "308" + }, { + "id" : "310" + }, { + "id" : "313" + }, { + "id" : "314" + }, { + "id" : "316" + } ] + }, { + "containerId" : "7", + "dimensions" : { + "height" : 2585, + "width" : 4005 + }, + "elements" : [ { + "id" : "11", + "x" : 284, + "y" : 2080 + }, { + "id" : "47", + "x" : 1529, + "y" : 65 + }, { + "id" : "79", + "x" : 479, + "y" : 490 + }, { + "id" : "80", + "x" : 2519, + "y" : 500 + }, { + "id" : "81", + "x" : 119, + "y" : 945 + }, { + "id" : "82", + "x" : 694, + "y" : 950 + }, { + "id" : "83", + "x" : 1884, + "y" : 970 + }, { + "id" : "84", + "x" : 2400, + "y" : 970 + }, { + "id" : "85", + "x" : 2916, + "y" : 970 + }, { + "id" : "86", + "x" : 3434, + "y" : 970 + }, { + "id" : "87", + "x" : 865, + "y" : 1620 + }, { + "id" : "88", + "x" : 1884, + "y" : 1515 + }, { + "id" : "89", + "x" : 2527, + "y" : 1515 + }, { + "id" : "90", + "x" : 3170, + "y" : 1515 + }, { + "id" : "91", + "x" : 1245, + "y" : 1300 + }, { + "id" : "92", + "x" : 2545, + "y" : 2150 + } ], + "externalContainerBoundariesVisible" : false, + "key" : "Events", + "order" : 4, + "relationships" : [ { + "id" : "263" + }, { + "id" : "275" + }, { + "id" : "276" + }, { + "id" : "278" + }, { + "id" : "279" + }, { + "id" : "280" + }, { + "id" : "281" + }, { + "id" : "282" + }, { + "id" : "284" + }, { + "id" : "287" + }, { + "id" : "297" + }, { + "id" : "298" + }, { + "id" : "299" + }, { + "id" : "300" + }, { + "id" : "325" + }, { + "id" : "327" + }, { + "id" : "330" + }, { + "id" : "332" + }, { + "id" : "334" + }, { + "id" : "335" + }, { + "id" : "337" + } ] + }, { + "containerId" : "98", "dimensions" : { "height" : 2510, "width" : 1713 }, "elements" : [ { - "id" : "15", - "x" : 1042, + "id" : "14", + "x" : 1035, "y" : 165 }, { - "id" : "35", + "id" : "99", "x" : 1042, "y" : 765 }, { - "id" : "36", + "id" : "100", "x" : 292, "y" : 765 }, { - "id" : "37", + "id" : "101", "x" : 292, "y" : 1365 }, { - "id" : "38", + "id" : "102", "x" : 1042, "y" : 1365 }, { - "id" : "44", + "id" : "108", "x" : 199, "y" : 1975 }, { - "id" : "48", + "id" : "112", "x" : 789, "y" : 1975 } ], "externalContainerBoundariesVisible" : false, "key" : "icons_service", - "order" : 1, + "order" : 7, "relationships" : [ { - "id" : "39" + "id" : "103" }, { - "id" : "42" + "id" : "106" }, { - "id" : "43" + "id" : "107" }, { - "id" : "45" + "id" : "109" }, { - "id" : "49" + "id" : "113" } ] } ], "configuration" : { "branding" : { }, - "lastSavedView" : "Bitwarden", + "lastSavedView" : "Events_RabbitMQ", + "metadataSymbols" : "SquareBrackets", "styles" : { "elements" : [ { "background" : "#d34407", @@ -974,264 +3562,893 @@ }, "containerViews" : [ { "dimensions" : { - "height" : 4020, - "width" : 7258 + "height" : 3997, + "width" : 6335 }, "elements" : [ { "id" : "2", - "x" : 317, - "y" : 2108 + "x" : 5735, + "y" : 2881 }, { "id" : "3", - "x" : 6650, - "y" : 2108 + "x" : 5735, + "y" : 2336 }, { "id" : "5", - "x" : 2383, - "y" : 1508 + "x" : 2165, + "y" : 1471 }, { "id" : "7", - "x" : 1633, - "y" : 1508 + "x" : 1425, + "y" : 1735 }, { "id" : "8", - "x" : 3883, - "y" : 1508 + "x" : 3755, + "y" : 1471 }, { "id" : "9", - "x" : 3883, - "y" : 2808 + "x" : 3755, + "y" : 2771 }, { "id" : "10", - "x" : 1325, - "y" : 2808 + "x" : 1645, + "y" : 2770 }, { "id" : "11", - "x" : 2825, - "y" : 3408 + "x" : 2697, + "y" : 3371 }, { "id" : "12", - "x" : 1767, - "y" : 2158 + "x" : 2914, + "y" : 2115 }, { "id" : "13", - "x" : 3042, - "y" : 2158 + "x" : 3664, + "y" : 2115 }, { "id" : "14", - "x" : 3792, - "y" : 2158 + "x" : 1360, + "y" : 865 }, { - "id" : "15", - "x" : 1633, - "y" : 908 + "id" : "21", + "x" : 2110, + "y" : 865 }, { "id" : "22", - "x" : 2383, - "y" : 908 + "x" : 200, + "y" : 866 }, { "id" : "23", - "x" : 358, - "y" : 1508 + "x" : 3610, + "y" : 865 }, { - "id" : "24", - "x" : 3883, - "y" : 908 + "id" : "25", + "x" : 3552, + "y" : 165 }, { "id" : "26", - "x" : 3825, - "y" : 208 + "x" : 2995, + "y" : 2771 }, { - "id" : "27", - "x" : 2825, - "y" : 2808 + "id" : "29", + "x" : 810, + "y" : 1471 }, { "id" : "30", - "x" : 1017, - "y" : 2158 + "x" : 2405, + "y" : 2771 }, { "id" : "31", - "x" : 2075, - "y" : 2808 + "x" : 2860, + "y" : 865 }, { "id" : "32", - "x" : 3133, - "y" : 908 + "x" : 4269, + "y" : 2115 }, { "id" : "33", - "x" : 4542, - "y" : 2158 + "x" : 2125, + "y" : 2105 }, { - "id" : "34", - "x" : 3133, - "y" : 1508 + "id" : "47", + "x" : 2130, + "y" : 2110 }, { - "id" : "44", - "x" : 5292, - "y" : 2158 + "id" : "92", + "x" : 201, + "y" : 2775 }, { - "id" : "48", - "x" : 5292, - "y" : 2158 + "id" : "98", + "x" : 3005, + "y" : 1471 + }, { + "id" : "108", + "x" : 5019, + "y" : 2115 + }, { + "id" : "112", + "x" : 5019, + "y" : 2115 } ], "externalSoftwareSystemBoundariesVisible" : false, "key" : "Bitwarden_Server", - "order" : 3, - "paperSize" : "A1_Landscape", + "order" : 9, "relationships" : [ { - "id" : "100" - }, { - "id" : "102" - }, { - "id" : "103", + "id" : "104", + "position" : 15, "vertices" : [ { - "x" : 1175, - "y" : 2808 + "x" : 1960, + "y" : 1165 }, { - "x" : 1175, - "y" : 3108 + "x" : 2710, + "y" : 1361 } ] }, { - "id" : "104" - }, { - "id" : "106", + "id" : "110", "vertices" : [ { - "x" : 3076, - "y" : 1475 - } ] - }, { - "id" : "109", - "vertices" : [ { - "x" : 2983, - "y" : 1808 + "x" : 3460, + "y" : 1765 }, { - "x" : 4512, - "y" : 2108 + "x" : 4869, + "y" : 2065 } ] }, { - "id" : "112", + "id" : "114", "vertices" : [ { - "x" : 2889, + "x" : 3460, + "y" : 1765 + }, { + "x" : 4869, + "y" : 2065 + } ] + }, { + "id" : "125", + "vertices" : [ { + "x" : 5619, + "y" : 2065 + }, { + "x" : 5619, + "y" : 2465 + } ] + }, { + "id" : "128", + "vertices" : [ { + "x" : 1960, + "y" : 865 + } ] + }, { + "id" : "129" + }, { + "id" : "131" + }, { + "id" : "135" + }, { + "id" : "147" + }, { + "id" : "153", + "position" : 10 + }, { + "id" : "154" + }, { + "id" : "155", + "vertices" : [ { + "x" : 2764, + "y" : 2471 + }, { + "x" : 3610, + "y" : 2771 + }, { + "x" : 3585, + "y" : 3026 + } ] + }, { + "id" : "156" + }, { + "id" : "157" + }, { + "id" : "158", + "vertices" : [ { + "x" : 3514, + "y" : 2071 + } ] + }, { + "id" : "159" + }, { + "id" : "160" + }, { + "id" : "161" + }, { + "id" : "163" + }, { + "id" : "164", + "position" : 10, + "vertices" : [ { + "x" : 1375, + "y" : 3205 + } ] + }, { + "id" : "165" + }, { + "id" : "167", + "position" : 65, + "vertices" : [ { + "x" : 3020, "y" : 1240 } ] }, { - "id" : "114" - }, { - "id" : "28" - }, { - "id" : "40", + "id" : "170", "vertices" : [ { - "x" : 2233, - "y" : 1208 + "x" : 2710, + "y" : 1765 }, { - "x" : 2983, - "y" : 1404 + "x" : 4239, + "y" : 2065 } ] }, { - "id" : "46", + "id" : "173", "vertices" : [ { - "x" : 3733, - "y" : 1808 - }, { - "x" : 5142, - "y" : 2108 + "x" : 2616, + "y" : 1197 } ] }, { - "id" : "50", + "id" : "176", + "position" : 30 + }, { + "id" : "178", + "position" : 70 + }, { + "id" : "180", + "position" : 70, "vertices" : [ { - "x" : 3733, - "y" : 1808 - }, { - "x" : 5142, - "y" : 2108 + "x" : 1465, + "y" : 2240 } ] }, { - "id" : "61", + "id" : "182", + "position" : 10 + }, { + "id" : "184", + "position" : 10 + }, { + "id" : "186" + }, { + "id" : "188", + "position" : 40 + }, { + "id" : "190", "vertices" : [ { - "x" : 5892, - "y" : 2108 - }, { - "x" : 5892, - "y" : 2508 + "x" : 1480, + "y" : 2245 } ] }, { - "id" : "64", + "id" : "192" + }, { + "id" : "194" + }, { + "id" : "209" + }, { + "id" : "227" + }, { + "id" : "27" + }, { + "id" : "277", "vertices" : [ { - "x" : 2233, - "y" : 908 + "x" : 1750, + "y" : 2905 } ] }, { - "id" : "65", - "vertices" : [ { - "x" : 6425, - "y" : 2508 - } ] + "id" : "305" }, { - "id" : "67", - "vertices" : [ { - "x" : 837, - "y" : 2508 - }, { - "x" : 3425, - "y" : 2808 - } ] + "id" : "329" }, { - "id" : "71" - }, { - "id" : "83", - "vertices" : [ { - "x" : 208, - "y" : 1404 - }, { - "x" : 208, - "y" : 1808 - }, { - "x" : 867, - "y" : 2108 - } ] - }, { - "id" : "89", - "vertices" : [ { - "x" : 1617, - "y" : 2108 - } ] - }, { - "id" : "90" - }, { - "id" : "91", - "vertices" : [ { - "x" : 2892, - "y" : 2508 - }, { - "x" : 3425, - "y" : 2808 - }, { - "x" : 3425, - "y" : 3108 - } ] - }, { - "id" : "92" - }, { - "id" : "93" - }, { - "id" : "94" - }, { - "id" : "95" - }, { - "id" : "96", - "vertices" : [ { - "x" : 3642, - "y" : 2108 - } ] - }, { - "id" : "97" - }, { - "id" : "98" - }, { - "id" : "99" + "id" : "343" } ], "softwareSystemId" : "4" } ], + "dynamicViews" : [ { + "description" : "Event Integrations / ASB Detail", + "dimensions" : { + "height" : 3656, + "width" : 4760 + }, + "elementId" : "10", + "elements" : [ { + "id" : "11", + "x" : 4110, + "y" : 681 + }, { + "id" : "34", + "x" : 230, + "y" : 681 + }, { + "id" : "35", + "x" : 220, + "y" : 2320 + }, { + "id" : "36", + "x" : 1014, + "y" : 172 + }, { + "id" : "37", + "x" : 1014, + "y" : 884 + }, { + "id" : "38", + "x" : 1014, + "y" : 1242 + }, { + "id" : "39", + "x" : 1014, + "y" : 528 + }, { + "id" : "42", + "x" : 1010, + "y" : 1685 + }, { + "id" : "43", + "x" : 1010, + "y" : 2669 + }, { + "id" : "44", + "x" : 1010, + "y" : 3000 + }, { + "id" : "45", + "x" : 1010, + "y" : 2341 + }, { + "id" : "46", + "x" : 1010, + "y" : 2013 + }, { + "id" : "66", + "x" : 3300, + "y" : 191 + }, { + "id" : "67", + "x" : 1983, + "y" : 191 + }, { + "id" : "68", + "x" : 2005, + "y" : 2320 + }, { + "id" : "69", + "x" : 2465, + "y" : 666 + }, { + "id" : "70", + "x" : 2705, + "y" : 1720 + }, { + "id" : "71", + "x" : 2705, + "y" : 2060 + }, { + "id" : "72", + "x" : 2705, + "y" : 2544 + }, { + "id" : "73", + "x" : 2705, + "y" : 2904 + }, { + "id" : "74", + "x" : 3335, + "y" : 896 + }, { + "id" : "75", + "x" : 3325, + "y" : 1720 + }, { + "id" : "76", + "x" : 3325, + "y" : 2060 + }, { + "id" : "77", + "x" : 3325, + "y" : 2709 + }, { + "id" : "78", + "x" : 2880, + "y" : 1171 + }, { + "id" : "93", + "x" : 4055, + "y" : 1720 + }, { + "id" : "94", + "x" : 4055, + "y" : 2060 + }, { + "id" : "95", + "x" : 4055, + "y" : 3108 + }, { + "id" : "96", + "x" : 4055, + "y" : 2444 + }, { + "id" : "97", + "x" : 4055, + "y" : 2776 + } ], + "externalBoundariesVisible" : false, + "key" : "Events_Processor_Azure_Service_Bus", + "order" : 5, + "relationships" : [ { + "id" : "195", + "order" : "1", + "response" : false + }, { + "id" : "197", + "order" : "2", + "response" : false + }, { + "id" : "198", + "order" : "3", + "response" : false + }, { + "id" : "200", + "order" : "4", + "response" : false + }, { + "id" : "206", + "order" : "5", + "response" : false + }, { + "id" : "213", + "order" : "6", + "response" : false + }, { + "id" : "215", + "order" : "7", + "response" : false + }, { + "id" : "219", + "order" : "8", + "response" : false + }, { + "id" : "210", + "order" : "9", + "response" : false + }, { + "id" : "230", + "order" : "10", + "response" : false + }, { + "id" : "221", + "order" : "11", + "response" : false + }, { + "id" : "226", + "order" : "12", + "response" : false + }, { + "id" : "225", + "order" : "13", + "response" : false + }, { + "id" : "228", + "order" : "14", + "response" : false + }, { + "id" : "229", + "order" : "15", + "response" : false + }, { + "id" : "222", + "order" : "16", + "response" : false, + "vertices" : [ { + "x" : 2440, + "y" : 1615 + }, { + "x" : 455, + "y" : 1615 + } ] + }, { + "id" : "203", + "order" : "17", + "response" : false + }, { + "id" : "204", + "order" : "18", + "response" : false + }, { + "id" : "201", + "order" : "19", + "response" : false + }, { + "id" : "205", + "order" : "20", + "response" : false + }, { + "id" : "202", + "order" : "21", + "response" : false + }, { + "id" : "231", + "order" : "22", + "response" : false + }, { + "id" : "243", + "order" : "23", + "response" : false + }, { + "id" : "240", + "order" : "24", + "response" : false + }, { + "id" : "235", + "order" : "25", + "response" : false + }, { + "id" : "238", + "order" : "26", + "response" : false + }, { + "id" : "234", + "order" : "27", + "response" : false + }, { + "id" : "245", + "order" : "28", + "response" : false + }, { + "id" : "242", + "order" : "29", + "response" : false + }, { + "id" : "237", + "order" : "30", + "response" : false + }, { + "id" : "301", + "order" : "31", + "response" : false + }, { + "id" : "302", + "order" : "32", + "response" : false + }, { + "id" : "308", + "order" : "33", + "response" : false + }, { + "id" : "309", + "order" : "34", + "response" : false + }, { + "id" : "314", + "order" : "35", + "response" : false + }, { + "id" : "313", + "order" : "36", + "response" : false + }, { + "id" : "319", + "order" : "37", + "response" : false + }, { + "id" : "315", + "order" : "38", + "response" : false + }, { + "id" : "322", + "order" : "39", + "response" : false + } ] + }, { + "description" : "Event Integrations / RabbitMQ Detail", + "dimensions" : { + "height" : 3878, + "width" : 4330 + }, + "elementId" : "7", + "elements" : [ { + "id" : "11", + "x" : 3664, + "y" : 560 + }, { + "id" : "48", + "x" : 219, + "y" : 706 + }, { + "id" : "49", + "x" : 239, + "y" : 2465 + }, { + "id" : "50", + "x" : 969, + "y" : 266 + }, { + "id" : "51", + "x" : 969, + "y" : 952 + }, { + "id" : "52", + "x" : 969, + "y" : 1296 + }, { + "id" : "53", + "x" : 969, + "y" : 609 + }, { + "id" : "56", + "x" : 969, + "y" : 1736 + }, { + "id" : "57", + "x" : 969, + "y" : 2822 + }, { + "id" : "58", + "x" : 969, + "y" : 3184 + }, { + "id" : "59", + "x" : 969, + "y" : 2465 + }, { + "id" : "60", + "x" : 969, + "y" : 2098 + }, { + "id" : "79", + "x" : 1852, + "y" : 266 + }, { + "id" : "80", + "x" : 1679, + "y" : 2465 + }, { + "id" : "81", + "x" : 2715, + "y" : 266 + }, { + "id" : "82", + "x" : 2155, + "y" : 815 + }, { + "id" : "83", + "x" : 2334, + "y" : 1750 + }, { + "id" : "84", + "x" : 2334, + "y" : 2115 + }, { + "id" : "85", + "x" : 2334, + "y" : 2670 + }, { + "id" : "86", + "x" : 2334, + "y" : 3230 + }, { + "id" : "87", + "x" : 2929, + "y" : 1005 + }, { + "id" : "88", + "x" : 2949, + "y" : 1750 + }, { + "id" : "89", + "x" : 2934, + "y" : 2115 + }, { + "id" : "90", + "x" : 2944, + "y" : 2890 + }, { + "id" : "91", + "x" : 2489, + "y" : 1330 + }, { + "id" : "93", + "x" : 3674, + "y" : 1750 + }, { + "id" : "94", + "x" : 3679, + "y" : 2115 + }, { + "id" : "95", + "x" : 3664, + "y" : 3330 + }, { + "id" : "96", + "x" : 3679, + "y" : 2537 + }, { + "id" : "97", + "x" : 3674, + "y" : 2933 + } ], + "externalBoundariesVisible" : false, + "key" : "Events_RabbitMQ", + "order" : 6, + "relationships" : [ { + "id" : "246", + "order" : "1", + "response" : false + }, { + "id" : "248", + "order" : "2", + "response" : false + }, { + "id" : "249", + "order" : "3", + "response" : false + }, { + "id" : "251", + "order" : "4", + "response" : false + }, { + "id" : "262", + "order" : "5", + "response" : false + }, { + "id" : "267", + "order" : "6", + "response" : false + }, { + "id" : "269", + "order" : "7", + "response" : false + }, { + "id" : "273", + "order" : "8", + "response" : false + }, { + "id" : "275", + "order" : "9", + "response" : false + }, { + "id" : "276", + "order" : "10", + "response" : false + }, { + "id" : "278", + "order" : "11", + "response" : false + }, { + "id" : "279", + "order" : "12", + "response" : false + }, { + "id" : "281", + "order" : "13", + "response" : false + }, { + "id" : "280", + "order" : "14", + "response" : false + }, { + "id" : "282", + "order" : "15", + "response" : false + }, { + "id" : "283", + "order" : "16", + "response" : false, + "vertices" : [ { + "x" : 2365, + "y" : 1650 + }, { + "x" : 474, + "y" : 1650 + } ] + }, { + "id" : "254", + "order" : "17", + "response" : false + }, { + "id" : "256", + "order" : "18", + "response" : false + }, { + "id" : "253", + "order" : "19", + "response" : false + }, { + "id" : "255", + "order" : "20", + "response" : false + }, { + "id" : "252", + "order" : "21", + "response" : false + }, { + "id" : "286", + "order" : "22", + "response" : false + }, { + "id" : "295", + "order" : "23", + "response" : false + }, { + "id" : "293", + "order" : "24", + "response" : false + }, { + "id" : "289", + "order" : "25", + "response" : false + }, { + "id" : "291", + "order" : "26", + "response" : false + }, { + "id" : "297", + "order" : "27", + "response" : false + }, { + "id" : "298", + "order" : "28", + "response" : false + }, { + "id" : "299", + "order" : "29", + "response" : false + }, { + "id" : "300", + "order" : "30", + "response" : false + }, { + "id" : "325", + "order" : "31", + "response" : false + }, { + "id" : "326", + "order" : "32", + "response" : false + }, { + "id" : "330", + "order" : "33", + "response" : false + }, { + "id" : "331", + "order" : "34", + "response" : false + }, { + "id" : "334", + "order" : "35", + "response" : false + }, { + "id" : "335", + "order" : "36", + "response" : false + }, { + "id" : "339", + "order" : "37", + "response" : false + }, { + "id" : "336", + "order" : "38", + "response" : false + }, { + "id" : "341", + "order" : "39", + "response" : false + } ] + } ], + "filteredViews" : [ { + "baseViewKey" : "Bitwarden_Server", + "key" : "Cloud", + "mode" : "Exclude", + "order" : 10, + "tags" : [ "Self-Hosted-Only" ] + }, { + "baseViewKey" : "Bitwarden_Server", + "key" : "Self-Hosted", + "mode" : "Exclude", + "order" : 11, + "tags" : [ "Cloud-Only" ] + } ], "systemLandscapeViews" : [ { "dimensions" : { "height" : 2820, @@ -1251,103 +4468,109 @@ "y" : 908 }, { "id" : "4", - "x" : 1633, - "y" : 1608 + "x" : 1635, + "y" : 1605 }, { - "id" : "15", - "x" : 3108, - "y" : 958 + "id" : "14", + "x" : 3110, + "y" : 960 }, { - "id" : "22", + "id" : "21", "x" : 2358, "y" : 958 }, { - "id" : "23", + "id" : "22", "x" : 1608, "y" : 958 }, { - "id" : "24", + "id" : "23", "x" : 3195, "y" : 2210 }, { - "id" : "25", + "id" : "24", "x" : 3125, "y" : 208 }, { - "id" : "26", + "id" : "25", "x" : 3825, "y" : 208 }, { - "id" : "32", + "id" : "31", "x" : 1633, "y" : 2210 }, { - "id" : "33", + "id" : "32", "x" : 883, "y" : 2210 }, { - "id" : "44", + "id" : "92", + "x" : 265, + "y" : 2215 + }, { + "id" : "108", "x" : 2383, "y" : 2210 }, { - "id" : "48", + "id" : "112", "x" : 2383, "y" : 2210 } ], "enterpriseBoundaryVisible" : true, "key" : "Bitwarden", - "order" : 2, + "order" : 8, "paperSize" : "A3_Landscape", "relationships" : [ { - "id" : "101" - }, { - "id" : "107", - "vertices" : [ { - "x" : 1708, - "y" : 2058 - } ] - }, { - "id" : "110" - }, { - "id" : "113", - "vertices" : [ { - "x" : 2008, - "y" : 2058 - } ] - }, { - "id" : "115" - }, { - "id" : "29" - }, { - "id" : "41", + "id" : "105", "vertices" : [ { "x" : 2958, "y" : 1308 } ] }, { - "id" : "47" + "id" : "111" }, { - "id" : "51" + "id" : "115" }, { - "id" : "53" + "id" : "117" }, { - "id" : "60" + "id" : "124" }, { - "id" : "62", + "id" : "126", "vertices" : [ { "x" : 3708, "y" : 1308 } ] }, { - "id" : "64" + "id" : "128" }, { - "id" : "66" + "id" : "130" }, { - "id" : "68", + "id" : "132", "vertices" : [ { "x" : 729, "y" : 1308 } ] + }, { + "id" : "162" + }, { + "id" : "168", + "vertices" : [ { + "x" : 1708, + "y" : 2058 + } ] + }, { + "id" : "171" + }, { + "id" : "174", + "vertices" : [ { + "x" : 2008, + "y" : 2058 + } ] + }, { + "id" : "28" + }, { + "id" : "307" + }, { + "id" : "344" } ] } ] } diff --git a/docs/dirt/event_integrations/models.dsl b/docs/dirt/event_integrations/models.dsl new file mode 100644 index 0000000000..c402e060eb --- /dev/null +++ b/docs/dirt/event_integrations/models.dsl @@ -0,0 +1,294 @@ +!element server { + azure_service_bus = container "Azure Service Bus" { + description "AMQP service used for pub/sub architecture for Events and Integrations" + tags "Events", "Azure", "ASB", "Cloud-Only" + + event_topic = component "Event Topic" { + description "The main entry point for all events in the system. When an event occurs, it is published to this topic." + tags "Events", "ASB", "Event Tier" + } + + integration_topic = component "Integration Topic" { + description "Events that have integrations configured are processed and put on the integration topic with a routing key for their specific integration handler to process." + tags "Events", "ASB", "Integrations", "Integration Tier" + } + + eventsWriteSub = component "events-write-subscription" { + description "Subscription for EventRepositoryHandler to write all events into azure table storage." + tags "ASB", "Subscription", "Event Tier" + } + + eventsSlackSub = component "events-slack-subscription" { + description "Subscription for slack-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Slack integration configured." + tags "ASB", "Subscription", "Event Tier", "Slack" + } + + eventsWebhookSub = component "events-webhook-subscription" { + description "Subscription for webhook-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a webhook integration configured." + tags "ASB", "Subscription", "Event Tier", "Webhook" + } + + eventsHecSub = component "events-hec-subscription" { + description "Subscription for HEC-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a HEC integration configured." + tags "ASB", "Subscription", "Event Tier", "HEC" + } + + eventsDatadogSub = component "events-datadog-subscription" { + description "Subscription for Datadog-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Datadog integration configured." + tags "ASB", "Subscription", "Event Tier", "Datadog" + } + + eventsTeamsSub = component "events-teams-subscription" { + description "Subscription for Microsoft Teams-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Teams integration configured." + tags "ASB", "Subscription", "Event Tier", "Teams" + } + + integrationSlackSub = component "integration-slack-subscription" { + description "Integration-level subscription for Slack IntegrationMessages. Correlation filter: Label = 'slack'." + tags "ASB", "Subscription", "Integration Tier", "Slack" + } + + integrationWebhookSub = component "integration-webhook-subscription" { + description "Integration-level subscription for Webhook IntegrationMessages. Correlation filter: Label = 'webhook'." + tags "ASB", "Subscription", "Integration Tier", "Webhook" + } + + integrationHecSub = component "integration-hec-subscription" { + description "Integration-level subscription for HEC IntegrationMessages. Correlation filter: Label = 'hec'." + tags "ASB", "Subscription", "Integration Tier", "HEC" + } + + integrationDatadogSub = component "integration-datadog-subscription" { + description "Integration-level subscription for Datadog IntegrationMessages. Correlation filter: Label = 'datadog'." + tags "ASB", "Subscription", "Integration Tier", "Datadog" + } + + integrationTeamsSub = component "integration-teams-subscription" { + description "Integration-level subscription for Microsoft Teams IntegrationMessages. Correlation filter: Label = 'teams'." + tags "ASB", "Subscription", "Integration Tier", "Teams" + } + } + + rabbit_mq = container "RabbitMQ" { + tags "Events" + tags "RabbitMQ" + tags "Self-Hosted-Only" + + event_exchange = component "Event Exchange" { + tags "Events", "Event Tier" + } + + integration_exchange = component "Integration Exchange" { + tags "Events", "Integrations", "Integration Tier" + } + + eventsWriteQueue = component "events-write-queue" { + description "Queue for EventRepositoryHandler to write all events into the database." + tags "RabbitMQ", "Queue", "Event Tier" + } + + eventsSlackQueue = component "events-slack-queue" { + description "Queue for slack-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Slack integration configured." + tags "RabbitMQ", "Queue", "Event Tier", "Slack" + } + + eventsWebhookQueue = component "events-webhook-queue" { + description "Queue for webhook-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a webhook integration configured." + tags "RabbitMQ", "Queue", "Event Tier", "Webhook" + } + + eventsHecQueue = component "events-hec-queue" { + description "Queue for HEC-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a HEC integration configured." + tags "RabbitMQ", "Queue", "Event Tier", "HEC" + } + + eventsDatadogQueue = component "events-datadog-queue" { + description "Queue for Datadog-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Datadog integration configured." + tags "RabbitMQ", "Queue", "Event Tier", "Datadog" + } + + eventsTeamsQueue = component "events-teams-queue" { + description "Queue for Microsoft Teams-specific EventIntegrationHandler which publishes processed events to the integration tier if there is a Teams integration configured." + tags "RabbitMQ", "Queue", "Event Tier", "Teams" + } + + integrationSlackQueue = component "integration-slack-queue" { + description "Integration-level queue for Slack IntegrationMessages. Routing key = 'slack'." + tags "RabbitMQ", "Queue", "Integration Tier", "Slack" + } + + integrationWebhookQueue = component "integration-webhook-queue" { + description "Integration-level queue for Webhook IntegrationMessages. Routing key = 'webhook'." + tags "RabbitMQ", "Queue", "Integration Tier", "Webhook" + } + + integrationHecQueue = component "integration-hec-queue" { + description "Integration-level queue for HEC IntegrationMessages. Routing key = 'hec'." + tags "RabbitMQ", "Queue", "Integration Tier", "HEC" + } + + integrationDatadogQueue = component "integration-datadog-queue" { + description "Integration-level queue for Datadog IntegrationMessages. Routing key = 'datadog'." + tags "RabbitMQ", "Queue", "Integration Tier", "Datadog" + } + + integrationTeamsQueue = component "integration-teams-queue" { + description "Integration-level queue for Teams IntegrationMessages. Routing key = 'teams'." + tags "RabbitMQ", "Queue", "Integration Tier", "Teams" + } + + integrationSlackRetryQueue = component "integration-slack-retry-queue" { + description "Integration-level retry queue for Slack IntegrationMessages. Routing key = 'slack-retry'." + tags "RabbitMQ", "Queue", "Integration Tier", "Slack" + } + + integrationWebhookRetryQueue = component "integration-webhook-retry-queue" { + description "Integration-level retry queue for Webhook IntegrationMessages. Routing key = 'webhook-retry'." + tags "RabbitMQ", "Queue", "Integration Tier", "Webhook" + } + + integrationHecRetryQueue = component "integration-hec-retry-queue" { + description "Integration-level retry queue for HEC IntegrationMessages. Routing key = 'hec-retry'." + tags "RabbitMQ", "Queue", "Integration Tier", "HEC" + } + + integrationDatadogRetryQueue = component "integration-datadog-retry-queue" { + description "Integration-level retry queue for Datadog IntegrationMessages. Routing key = 'datadog-retry'." + tags "RabbitMQ", "Queue", "Integration Tier", "Datadog" + } + + integrationTeamsRetryQueue = component "integration-teams-retry-queue" { + description "Integration-level retry queue for Teams IntegrationMessages. Routing key = 'teams-retry'." + tags "RabbitMQ", "Queue", "Integration Tier", "Teams" + } + } +} + +!element server.events_processor { + tags "Cloud-Only" + + event_repository_handler = component "EventRepositoryHandler" { + description "Handles all events, passing them off to the IEventWriteService with the `persistent` key for long term storage." + } + event_listener = component "AzureServiceBusEventListenerService" { + description "Listens to a specific subscription and passes off to a handler to handle events" + } + integration_listener = component "AzureServiceBusIntegrationListenerService" { + description "Listens to a specific subscription and passes off to a handler to handle IntegrationMessages" + } + event_integration_handler = component "EventIntegrationHandler" { + description "Fetches the relevant configurations when an event comes in and hands the event to its paired integration handler for processing." + } + slack_integration_handler = component "SlackIntegrationHandler" { + description "Processes Slack IntegrationMessages, posting them to the configured channels." + } + teams_integration_handler = component "TeamsIntegrationHandler" { + description "Processes Teams IntegrationMessages, posting them to the configured channels." + } + datadog_integration_handler = component "DatadogIntegrationHandler" { + description "Processes Datadog IntegrationMessages, posting them to the configured URI." + } + webhook_integration_handler = component "WebhookIntegrationHandler" { + description "Processes Webhook and HEC IntegrationMessages, posting them to the configured URI." + } + event_integrations_extended_cache = component "EventIntegrationsExtendedCache" { + description "Caches all configurations for integrations so that events can be handled without adding database load." + } + slack_service = component "SlackService" { + description "Handles all API interaction with Slack." + } + teams_service = component "TeamsService" { + description "Handles all API interaction with Teams." + } + http_client = component "HttpClient" { + description "Performs any HTTP functions for Datadog / Webhooks / HEC." + } + integration_filter_service = component "IntegrationFilterService" { + description "Processes filters from configurations to determine if an event should be processed out to the integration." + } +} + +!element server.events { + event_listener = component "RabbitMqEventListenerService" { + tags "Self-Hosted-Only" + description "Listens to a specific queue and passes off to a handler to handle events" + } + integration_listener = component "RabbitMqIntegrationListenerService" { + tags "Self-Hosted-Only" + description "Listens to a specific queue and passes off to a handler to handle IntegrationMessages" + } + event_repository_handler = component "EventRepositoryHandler" { + tags "Self-Hosted-Only" + description "Handles all events, passing them off to the IEventWriteService with the `persistent` key for long term storage." + } + event_integration_handler = component "EventIntegrationHandler" { + tags "Self-Hosted-Only" + description "Fetches the relevant configurations when an event comes in and hands the event to its paired integration handler for processing." + } + slack_integration_handler = component "SlackIntegrationHandler" { + tags "Self-Hosted-Only" + description "Processes Slack IntegrationMessages, posting them to the configured channels." + } + teams_integration_handler = component "TeamsIntegrationHandler" { + tags "Self-Hosted-Only" + description "Processes Teams IntegrationMessages, posting them to the configured channels." + } + datadog_integration_handler = component "DatadogIntegrationHandler" { + tags "Self-Hosted-Only" + description "Processes Datadog IntegrationMessages, posting them to the configured URI." + } + webhook_integration_handler = component "WebhookIntegrationHandler" { + tags "Self-Hosted-Only" + description "Processes Webhook and HEC IntegrationMessages, posting them to the configured URI." + } + event_integrations_extended_cache = component "EventIntegrationsExtendedCache" { + tags "Self-Hosted-Only" + description "Caches all configurations for integrations so that events can be handled without adding database load." + } + slack_service = component "SlackService" { + tags "Self-Hosted-Only" + description "Handles all API interaction with Slack." + } + teams_service = component "TeamsService" { + tags "Self-Hosted-Only" + description "Handles all API interaction with Teams." + } + http_client = component "HttpClient" { + tags "Self-Hosted-Only" + description "Performs any HTTP functions for Datadog / Webhooks / HEC." + } + integration_filter_service = component "IntegrationFilterService" { + tags "Self-Hosted-Only" + description "Processes filters from configurations to determine if an event should be processed out to the integration." + } +} + +external_services = softwareSystem "External Services" { + tags "External", "Events", "Integrations" + description "External services (e.g. SIEM, Slack, et al) that consume events via integrations" + + slack = container "Slack" { + tags "External", "Events", "Integrations", "Slack" + description "Slack messaging service. Receives messages via configured event integrations." + } + + teams = container "Teams" { + tags "External", "Events", "Integrations", "Teams" + description "Microsoft Teams messaging service. Receives messages via configured event integrations." + } + + splunk = container "Splunk" { + tags "External", "Events", "Integrations", "Splunk" + description "Splunk SIEM service. Receives events via configured event integrations." + } + + datadog = container "Datadog" { + tags "External", "Events", "Integrations", "Datadog" + description "Datadog SIEM service. Receives events via configured event integrations." + } + + crowdstrike = container "Crowdstrike Falcon" { + tags "External", "Events", "Integrations", "CrowdStrike Falcon", "CrowdStrike" + description "CrowdStrike Falcon SIEM service. Receives events via configured event integrations." + } +} diff --git a/docs/dirt/event_integrations/relationships.dsl b/docs/dirt/event_integrations/relationships.dsl new file mode 100644 index 0000000000..bb58de853c --- /dev/null +++ b/docs/dirt/event_integrations/relationships.dsl @@ -0,0 +1,115 @@ +# Top Level event publishing +server.api -> server.azure_service_bus.event_topic "Sends events to" +server.events -> server.azure_service_bus.event_topic "Sends events to" +server.identity -> server.azure_service_bus.event_topic "Sends events to" +server.sso -> server.azure_service_bus.event_topic "Sends events to" +server.scim -> server.azure_service_bus.event_topic "Sends events to" +server.api -> server.rabbit_mq.event_exchange "Sends events to" +server.events -> server.rabbit_mq.event_exchange "Sends events to" +server.identity -> server.rabbit_mq.event_exchange "Sends events to" +server.sso -> server.rabbit_mq.event_exchange "Sends events to" +server.scim -> server.rabbit_mq.event_exchange "Sends events to" + +# Azure Service Bus topics, subscriptions, and routing +eventsWriteSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsWriteSub "Subscribes via fan-out" +eventsDatadogSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsDatadogSub "Subscribes via fan-out" +eventsHecSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsHecSub "Subscribes via fan-out" +eventsSlackSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsSlackSub "Subscribes via fan-out" +eventsTeamsSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsTeamsSub "Subscribes via fan-out" +eventsWebhookSub = server.azure_service_bus.event_topic -> server.azure_service_bus.eventsWebhookSub "Subscribes via fan-out" +integrationDatadogSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationDatadogSub "Subscribes via filter on Datadog key" +integrationHecSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationHecSub "Subscribes via filter on HEC key" +integrationSlackSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationSlackSub "Subscribes via filter on Slack key" +integrationTeamsSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationTeamsSub "Subscribes via filter on Teams key" +integrationWebhookSub = server.azure_service_bus.integration_topic -> server.azure_service_bus.integrationWebhookSub "Subscribes via filter on Webhook key" + +eventsWriteListener = server.events_processor.event_listener -> server.azure_service_bus.eventsWriteSub "Listens to" +eventsWriteDelegate = server.events_processor.event_listener -> server.events_processor.event_repository_handler "Delegates to" +eventsDatadogListener = server.events_processor.event_listener -> server.azure_service_bus.eventsDatadogSub "Listens to" +eventsHecListener = server.events_processor.event_listener -> server.azure_service_bus.eventsHecSub "Listens to" +eventsSlackListener = server.events_processor.event_listener -> server.azure_service_bus.eventsSlackSub "Listens to" +eventsTeamsListener = server.events_processor.event_listener -> server.azure_service_bus.eventsTeamsSub "Listens to" +eventsWebhookListener = server.events_processor.event_listener -> server.azure_service_bus.eventsWebhookSub "Listens to" +eventsIntegrationHandlerDelegate = server.events_processor.event_listener -> server.events_processor.event_integration_handler "Delegates to" + +eventIntegrationHandlerPublish = server.events_processor.event_integration_handler -> server.azure_service_bus.integration_topic "Publishes To" +eventIntegrationHandlerCache = server.events_processor.event_integration_handler -> server.events_processor.event_integrations_extended_cache "Fetches configurations from" +eventIntegrationHandlerDatabase = server.events_processor.event_integration_handler -> server.database "Fetches template details from" +cacheDatabaseFetch = server.events_processor.event_integrations_extended_cache -> server.database "Fetches configurations from" +eventIntegrationHandlerFilter = server.events_processor.event_integration_handler -> server.events_processor.integration_filter_service "Runs filters" +eventRepositoryDatabase = server.events_processor.event_repository_handler -> server.database "Writes events to" + +integrationSlackListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationSlackSub "Listens to" +integrationSlackDelegate = server.events_processor.integration_listener -> server.events_processor.slack_integration_handler "Delegates to" +integrationWebhookListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationWebhookSub "Listens to" +integrationWebhookDelegate = server.events_processor.integration_listener -> server.events_processor.webhook_integration_handler "Delegates to" +integrationHecListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationHecSub "Listens to" +integrationDatadogListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationDatadogSub "Listens to" +integrationDatadogDelegate = server.events_processor.integration_listener -> server.events_processor.datadog_integration_handler "Delegates to" +integrationTeamsListener = server.events_processor.integration_listener -> server.azure_service_bus.integrationTeamsSub "Listens to" +integrationTeamsDelegate = server.events_processor.integration_listener -> server.events_processor.teams_integration_handler "Delegates to" + +# RabbitMQ exchanges, queues, and routing +eventsWriteQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsWriteQueue "Subscribes via fan-out" +eventsDatadogQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsDatadogQueue "Subscribes via fan-out" +eventsHecQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsHecQueue "Subscribes via fan-out" +eventsSlackQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsSlackQueue "Subscribes via fan-out" +eventsTeamsQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsTeamsQueue "Subscribes via fan-out" +eventsWebhookQueue = server.rabbit_mq.event_exchange -> server.rabbit_mq.eventsWebhookQueue "Subscribes via fan-out" +integrationDatadogQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationDatadogQueue "Subscribes via filter on Datadog key" +integrationHecQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationHecQueue "Subscribes via filter on HEC key" +integrationSlackQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationSlackQueue "Subscribes via filter on Slack key" +integrationTeamsQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationTeamsQueue "Subscribes via filter on Teams key" +integrationWebhookQueue = server.rabbit_mq.integration_exchange -> server.rabbit_mq.integrationWebhookQueue "Subscribes via filter on Webhook key" +integrationDatadogRetryQueue = server.rabbit_mq.integrationDatadogRetryQueue -> server.rabbit_mq.integrationDatadogQueue "DLQ after configured retry timing" +integrationHecRetryQueue = server.rabbit_mq.integrationHecRetryQueue -> server.rabbit_mq.integrationHecQueue "DLQ after configured retry timing" +integrationSlackRetryQueue = server.rabbit_mq.integrationSlackRetryQueue -> server.rabbit_mq.integrationSlackQueue "DLQ after configured retry timing" +integrationTeamsRetryQueue = server.rabbit_mq.integrationTeamsRetryQueue -> server.rabbit_mq.integrationTeamsQueue "DLQ after configured retry timing" +integrationWebhookRetryQueue = server.rabbit_mq.integrationWebhookRetryQueue -> server.rabbit_mq.integrationWebhookQueue "DLQ after configured retry timing" + +eventsWriteListener_events = server.events.event_listener -> server.rabbit_mq.eventsWriteQueue "Listens to" +eventsDatadogListener_events = server.events.event_listener -> server.rabbit_mq.eventsDatadogQueue "Listens to" +eventsHecListener_events = server.events.event_listener -> server.rabbit_mq.eventsHecQueue "Listens to" +eventsSlackListener_events = server.events.event_listener -> server.rabbit_mq.eventsSlackQueue "Listens to" +eventsTeamsListener_events = server.events.event_listener -> server.rabbit_mq.eventsTeamsQueue "Listens to" +eventsWebhookListener_events = server.events.event_listener -> server.rabbit_mq.eventsWebhookQueue "Listens to" +eventsWriteDelegate_events = server.events.event_listener -> server.events.event_repository_handler "Delegates to" + +eventRepositoryDatabase_events = server.events.event_repository_handler -> server.database "Writes events to" tags "Self-Hosted-Only" +eventsIntegrationHandlerDelegate_events = server.events.event_listener -> server.events.event_integration_handler "Delegates to" +eventIntegrationHandlerDatabase_events = server.events.event_integration_handler -> server.database "Fetches template details from" +cacheDatabaseFetch_events = server.events.event_integrations_extended_cache -> server.database "Fetches configurations from" tags "Self-Hosted-Only" +eventIntegrationHandlerCache_events = server.events.event_integration_handler -> server.events.event_integrations_extended_cache "Fetches configurations from" +eventIntegrationHandlerFilter_events = server.events.event_integration_handler -> server.events.integration_filter_service "Runs filters" +eventIntegrationHandlerPublish_events = server.events.event_integration_handler -> server.rabbit_mq.integration_exchange "Publishes To" + +integrationSlackListener_events = server.events.integration_listener -> server.rabbit_mq.integrationSlackQueue "Listens to" +integrationWebhookListener_events = server.events.integration_listener -> server.rabbit_mq.integrationWebhookQueue "Listens to" +integrationHecListener_events = server.events.integration_listener -> server.rabbit_mq.integrationHecQueue "Listens to" +integrationDatadogListener_events = server.events.integration_listener -> server.rabbit_mq.integrationDatadogQueue "Listens to" +integrationTeamsListener_events = server.events.integration_listener -> server.rabbit_mq.integrationTeamsQueue "Listens to" +integrationSlackDelegate_events = server.events.integration_listener -> server.events.slack_integration_handler "Delegates to" +integrationTeamsDelegate_events = server.events.integration_listener -> server.events.teams_integration_handler "Delegates to" +integrationDatadogDelegate_events = server.events.integration_listener -> server.events.datadog_integration_handler "Delegates to" +integrationWebhookDelegate_events = server.events.integration_listener -> server.events.webhook_integration_handler "Delegates to" + +# External Services +slackToSlackService = server.events_processor.slack_integration_handler -> server.events_processor.slack_service "Uses" +slackServiceToSlack = server.events_processor.slack_service -> external_services.slack "Publishes configured events to" +teamsToTeamsService = server.events_processor.teams_integration_handler -> server.events_processor.teams_service "Uses" +teamsServiceToTeams = server.events_processor.teams_service -> external_services.teams "Publishes configured events to" +webhookHandlerHttpClient = server.events_processor.webhook_integration_handler -> server.events_processor.http_client "Uses" +datadogHandlerHttpClient = server.events_processor.datadog_integration_handler -> server.events_processor.http_client "Uses" +httpToCrowdstrike = server.events_processor.http_client -> external_services.crowdstrike "Publishes configured events to" +httpToDatadog = server.events_processor.http_client -> external_services.datadog "Publishes configured events to" +httpToSplunk = server.events_processor.http_client -> external_services.splunk "Publishes configured events to" + +slackToSlackService_events = server.events.slack_integration_handler -> server.events.slack_service "Uses" tags "Self-Hosted-Only" +slackServiceToSlack_events = server.events.slack_service -> external_services.slack "Publishes configured events to" tags "Self-Hosted-Only" +teamsToTeamsService_events = server.events.teams_integration_handler -> server.events.teams_service "Uses" tags "Self-Hosted-Only" +teamsServiceToTeams_events = server.events.teams_service -> external_services.teams "Publishes configured events to" tags "Self-Hosted-Only" +webhookHandlerHttpClient_events = server.events.webhook_integration_handler -> server.events.http_client "Uses" tags "Self-Hosted-Only" +datadogHandlerHttpClient_events = server.events.datadog_integration_handler -> server.events.http_client "Uses" tags "Self-Hosted-Only" +httpToCrowdstrike_events = server.events.http_client -> external_services.crowdstrike "Publishes configured events to" tags "Self-Hosted-Only" +httpToDatadog_events = server.events.http_client -> external_services.datadog "Publishes configured events to" tags "Self-Hosted-Only" +httpToSplunk_events = server.events.http_client -> external_services.splunk "Publishes configured events to" tags "Self-Hosted-Only" diff --git a/docs/dirt/event_integrations/views.dsl b/docs/dirt/event_integrations/views.dsl new file mode 100644 index 0000000000..309c9de1d0 --- /dev/null +++ b/docs/dirt/event_integrations/views.dsl @@ -0,0 +1,99 @@ +component server.azure_service_bus "Azure_Service_Bus" { + include * +} + +component server.rabbit_mq "RabbitMQ" { + include * +} + +component server.events_processor "Events_Processor" { + include * +} + +component server.events "Events" { + include * +} + +dynamic server.events_processor "Events_Processor_Azure_Service_Bus" "Event Integrations / ASB Detail" { + eventsWriteSub + eventsHecSub + eventsSlackSub + eventsWebhookSub + eventsWriteListener + eventsHecListener + eventsSlackListener + eventsWebhookListener + eventsWriteDelegate + eventRepositoryDatabase + eventsIntegrationHandlerDelegate + eventIntegrationHandlerDatabase + eventIntegrationHandlerCache + cacheDatabaseFetch + eventIntegrationHandlerFilter + eventIntegrationHandlerPublish + integrationSlackSub + integrationTeamsSub + integrationDatadogSub + integrationWebhookSub + integrationHecSub + integrationSlackListener + integrationTeamsListener + integrationDatadogListener + integrationWebhookListener + integrationHecListener + integrationSlackDelegate + integrationTeamsDelegate + integrationDatadogDelegate + integrationWebhookDelegate + slackToSlackService + slackServiceToSlack + teamsToTeamsService + teamsServiceToTeams + datadogHandlerHttpClient + webhookHandlerHttpClient + httpToDatadog + httpToCrowdstrike + httpToSplunk +} + +dynamic server.events "Events_RabbitMQ" "Event Integrations / RabbitMQ Detail" { + eventsWriteQueue + eventsHecQueue + eventsSlackQueue + eventsWebhookQueue + eventsWriteListener_events + eventsHecListener_events + eventsSlackListener_events + eventsWebhookListener_events + eventsWriteDelegate_events + eventRepositoryDatabase_events + eventsIntegrationHandlerDelegate_events + eventIntegrationHandlerDatabase_events + eventIntegrationHandlerCache_events + cacheDatabaseFetch_events + eventIntegrationHandlerFilter_events + eventIntegrationHandlerPublish_events + integrationSlackQueue + integrationWebhookQueue + integrationHecQueue + integrationTeamsQueue + integrationDatadogQueue + integrationSlackListener_events + integrationTeamsListener_events + integrationDatadogListener_events + integrationWebhookListener_events + integrationHecListener_events + integrationSlackDelegate_events + integrationTeamsDelegate_events + integrationDatadogDelegate_events + integrationWebhookDelegate_events + slackToSlackService_events + slackServiceToSlack_events + teamsToTeamsService_events + teamsServiceToTeams_events + webhookHandlerHttpClient_events + datadogHandlerHttpClient_events + httpToDatadog_events + httpToCrowdstrike_events + httpToSplunk_events +} diff --git a/docs/dirt/models.dsl b/docs/dirt/models.dsl new file mode 100644 index 0000000000..3d17a3a796 --- /dev/null +++ b/docs/dirt/models.dsl @@ -0,0 +1 @@ +!include "event_integrations/models.dsl" diff --git a/docs/dirt/relationships.dsl b/docs/dirt/relationships.dsl new file mode 100644 index 0000000000..66cfda2652 --- /dev/null +++ b/docs/dirt/relationships.dsl @@ -0,0 +1 @@ +!include "event_integrations/relationships.dsl" diff --git a/docs/dirt/views.dsl b/docs/dirt/views.dsl new file mode 100644 index 0000000000..c3d1de9852 --- /dev/null +++ b/docs/dirt/views.dsl @@ -0,0 +1 @@ +!include "event_integrations/views.dsl" diff --git a/docs/shared.models.dsl b/docs/shared.models.dsl index 7fc2935919..3ae1dfe49e 100644 --- a/docs/shared.models.dsl +++ b/docs/shared.models.dsl @@ -10,7 +10,6 @@ bw_controlled = group "Bitwarden Controlled" { customer_success = person "Customer Success" "A customer success engineer. Inspects bitwarden state through the admin portal and internal tools" { tags "Bitwarden Employee" } - # Root systems server = softwareSystem "Bitwarden Server" { api = container "API" { @@ -28,16 +27,13 @@ bw_controlled = group "Bitwarden Controlled" { } events_processor = container "Events Processor" { tags "Events" + tags "Cloud-Only" } # Data stores database = container "Database" { tags "Database" } - events_queue = container "Events Queue" { - tags "Queue" - tags "Azure" - } mail_queue = container "Mail Queue" { tags "Queue" tags "Azure" @@ -72,7 +68,7 @@ bw_controlled = group "Bitwarden Controlled" { tags "LDAP" tags "Self-Hosted" } - key_connector = softwareSystem "Key Connector" + key_connector = softwareSystem "Key Connector" } self_hosted_instances = softwareSystem "Self-Hosted Instances" { diff --git a/docs/shared.relationships.dsl b/docs/shared.relationships.dsl index 0d3eb7c4a2..3a1debbb31 100644 --- a/docs/shared.relationships.dsl +++ b/docs/shared.relationships.dsl @@ -35,12 +35,9 @@ server.api -> server.database "Queries" server.portal -> server.database "Queries" # queue Relationships -server.api -> server.events_queue "Sends events to" -server.events -> server.events_queue "Sends events to" server.api -> server.mail_queue "Sends emails to" server.api -> server.notifications_queue "Sends notifications to" server.notifications -> server.notifications_queue "Sends notifications to" -server.events_queue -> server.events_processor "Processes events from" server.mail_queue -> server.portal "Processes emails from" # self host phone home