diff --git a/docs/diagrams/c4-model/model.dsl b/docs/diagrams/c4-model/model.dsl index bb24608586..f3dc0fd215 100644 --- a/docs/diagrams/c4-model/model.dsl +++ b/docs/diagrams/c4-model/model.dsl @@ -1,5 +1,13 @@ # Read description in the 'views.dsl' file. +eSettDomain = group "eSett Exchange" { + eSettApi = container "eSett Exchange WebAPI" { + description "eSett exchange API" + technology "Asp.Net Core Web API" + tags "Microsoft Azure - App Services" "Titans" + } +} + frontendDomain = group "Frontend" { bffApp = container "BFF Web API" { description "Backend for frontend (BFF) combines data for presentation on DataHub 3 UI" @@ -9,6 +17,7 @@ frontendDomain = group "Frontend" { # Domain-to-domain relationships this -> wholesaleApi "Uses" "json/https" this -> markpartApi "Uses" "json/https" + this -> eSettApi "Uses" "json/https" } bffApi = container "BFF API" { description "API Gateway to BFF Web API" diff --git a/docs/diagrams/c4-model/views.json b/docs/diagrams/c4-model/views.json index bf7eb19834..7c46b027ce 100644 --- a/docs/diagrams/c4-model/views.json +++ b/docs/diagrams/c4-model/views.json @@ -1,1245 +1,1314 @@ { - "id": 1, - "name": "DataHub", - "description": "Description", - "lastModifiedDate": "2023-08-09T09:05:26Z", - "lastModifiedAgent": "structurizr-javascript", - "properties": { - "structurizr.dsl": "IyBUaGUgJ3ZpZXdzLmRzbCcgZmlsZSBpcyBpbnRlbmRlZCBhcyBhIG1lYW4gZm9yIHZpZXdpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIG1vZGVsCiMgaW4gdGhlIGRvbWFpbiByZXBvc2l0b3J5LiBJdCBzaG91bGQKIyAgICogRXh0ZW5kIHRoZSBiYXNlIG1vZGVsIGFuZCBvdmVycmlkZSB0aGUgJ2RoMycgc29mdHdhcmUgc3lzdGVtCiMgICAqIEluY2x1ZGUgb2YgdGhlIGBtb2RlbC5kc2xgIGZpbGVzIGZyb20gZWFjaCBkb21haW4gcmVwb3NpdG9yeSB1c2luZyBhbiBVUkwKIwojIFRoZSBgbW9kZWwuZHNsYCBmaWxlIG11c3QgY29udGFpbiB0aGUgYWN0dWFsIG1vZGVsLCBhbmQgaXMgdGhlIHBpZWNlIHRoYXQgbXVzdAojIGJlIHJldXNhYmxlIGFuZCBpbmNsdWRlZCBpbiBvdGhlciBTdHJ1Y3R1cml6ciBmaWxlcyBsaWtlIGB2aWV3cy5kc2xgIGFuZAojIGRlcGxveW1lbnQgZGlhZ3JhbSBmaWxlcy4KCndvcmtzcGFjZSBleHRlbmRzIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9FbmVyZ2luZXQtRGF0YUh1Yi9vcGVuZ2VoLWFyY2gtZGlhZ3JhbXMvbWFpbi9kb2NzL2RpYWdyYW1zL2M0LW1vZGVsL2RoLWJhc2UtbW9kZWwuZHNsIHsKCiAgICBtb2RlbCB7CiAgICAgICAgIwogICAgICAgICMgRGF0YUh1YiAzLjAgKGV4dGVuZHMpCiAgICAgICAgIwogICAgICAgICFyZWYgZGgzIHsKCiAgICAgICAgICAgICMgSU1QT1JUQU5UOgogICAgICAgICAgICAjIFRoZSBvcmRlciBieSB3aGljaCBtb2RlbHMgYXJlIGluY2x1ZGVkIGlzIGltcG9ydGFudCBmb3IgaG93IHRoZSBkb21haW4tdG8tZG9tYWluIHJlbGF0aW9uc2hpcHMgYXJlIHNwZWNpZmllZC4KICAgICAgICAgICAgIyBBIGRvbWFpbi10by1kb21haW4gcmVsYXRpb25zaGlwIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlICJjbGllbnQiIG9mIGEgImNsaWVudC0+c2VydmVyIiBkZXBlbmRlbmN5LCBhbmQKICAgICAgICAgICAgIyBoZW5jZSBkb21haW5zIHRoYXQgZG9lc24ndCBkZXBlbmQgb24gb3RoZXJzLCBzaG91bGQgYmUgbGlzdGVkIGZpcnN0LgoKICAgICAgICAgICAgIyBJbmNsdWRlIE1hcmtldCBQYXJ0aWNpcGFudCBtb2RlbAogICAgICAgICAgICAjIFJlYWQgZGVzY3JpcHRpb24gaW4gdGhlICd2aWV3cy5kc2wnIGZpbGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBtYXJrcGFydERvbWFpbiA9IGdyb3VwICJNYXJrZXQgUGFydGljaXBhbnQiIHsKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgQ29tbW9uIChtYW5hZ2VkIGJ5IE1hcmtldCBQYXJ0aWNpcGFudCkKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgIyBEb21haW4KICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIG1hcmtwYXJ0RGIgPSBjb250YWluZXIgIkFjdG9ycyBEYXRhYmFzZSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTdG9yZXMgZGF0YSByZWdhcmRpbmcgYWN0b3JzLCB1c2VycyBhbmQgcGVybWlzc2lvbnMuIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlNRTCBEYXRhYmFzZSBTY2hlbWEiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiRGF0YSBTdG9yYWdlIiAiTWljcm9zb2Z0IEF6dXJlIC0gU1FMIERhdGFiYXNlIiAiVGl0YW5zIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFya3BhcnRBcGkgPSBjb250YWluZXIgIk1hcmtldCBQYXJ0aWNpcGFudCBBUEkiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTXVsdGktdGVuYW50IEFQSSBmb3IgbWFuYWdpbmcgYWN0b3JzLCB1c2VycyBhbmQgcGVybWlzc2lvbnMuIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkFzcC5OZXQgQ29yZSBXZWIgQVBJIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEFwcCBTZXJ2aWNlcyIgIlRpdGFucyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gbWFya3BhcnREYiAiUmVhZHMgYW5kIHdyaXRlcyBhY3Rvci91c2VyIGRhdGEuIiAiRUYgQ29yZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcmtwYXJ0T3JnYW5pemF0aW9uTWFuYWdlciA9IGNvbnRhaW5lciAiTWFya2V0IFBhcnRpY2lwYW50IDxPcmdhbml6YXRpb24gTWFuYWdlcj4iIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiPGFkZCBkZXNjcmlwdGlvbj4iCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiQXp1cmUgZnVuY3Rpb24sIEMjIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEZ1bmN0aW9uIEFwcHMiICJUaXRhbnMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIG1hcmtwYXJ0RXZlbnRBY3RvclN5bmNocm9uaXplciA9IGNvbXBvbmVudCAiQWN0b3IgU3luY2hyb25pemVyIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJDcmVhdGVzIEIyQyBhcHBsaWNhdGlvbiByZWdpc3RyYXRpb24gZm9yIG5ld2x5IGNyZWF0ZWQgYWN0b3JzLiIKICAgICAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiVGltZXIgVHJpZ2dlciIKICAgICAgICAgICAgICAgICAgICAgICAgdGFncyAiTWljcm9zb2Z0IEF6dXJlIC0gRnVuY3Rpb24gQXBwcyIgIlRpdGFucyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQ29tbW9uIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBkaDMuc2hhcmVkQjJDICJDcmVhdGVzIEIyQyBBcHAgUmVnaXN0cmF0aW9uIiAiTWljcm9zb2Z0LkdyYXBoL2h0dHBzIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IG1hcmtwYXJ0RGIgIlVwZGF0ZXMgYWN0b3JzIHdpdGggZXh0ZXJuYWwgQjJDIGlkLiIgIkVGIENvcmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1hcmtwYXJ0TWFpbERpc3BhdGNoZXIgPSBjb21wb25lbnQgIk1haWwgRGlzcGF0Y2hlciIgewogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUmVzcG9uc2libGUgZm9yIHNlbmRpbmcgdXNlciBpbnZpdGF0aW9ucy4iCiAgICAgICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlRpbWVyIFRyaWdnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEZ1bmN0aW9uIEFwcHMiICJUaXRhbnMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIENvbW1vbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZGgzLnNoYXJlZFNlbmRHcmlkICJTZW5kcyBpbnZpdGF0aW9uIG1haWwiICJTZW5kR3JpZC9odHRwcyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgRG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBtYXJrcGFydERiICJSZWFkcyBkYXRhIHJlZ2FyZGluZyBuZXdseSBpbnZpdGVkIHVzZXJzLiIgIkVGIENvcmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEluY2x1ZGUgRURJIG1vZGVsCiAgICAgICAgICAgICMgUmVhZCBkZXNjcmlwdGlvbiBpbiB0aGUgJ3ZpZXdzLmRzbCcgZmlsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIGVkaURvbWFpbiA9IGdyb3VwICJFREkiIHsKICAgICAgICAgICAgICAgIGVkaURiID0gY29udGFpbmVyICJFREkgRGF0YWJhc2UiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3RvcmVzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gRURJIG9wZXJhdGlvbnMiCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiU1FMIFNlcnZlciIKICAgICAgICAgICAgICAgICAgICB0YWdzICJEYXRhIFN0b3JhZ2UsIE1pY3Jvc29mdCBBenVyZSAtIFNRTCBEYXRhYmFzZSIgIlBob2VuaXgiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlZGkgPSBjb250YWluZXIgIkVESSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCYWNrZW5kIHNlcnZlciBwcm92aWRpbmcgQVBJIGZvciBFREkgb3BlcmF0aW9ucyIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBenVyZSBmdW5jdGlvbiwgQyMiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiTWljcm9zb2Z0IEF6dXJlIC0gRnVuY3Rpb24gQXBwcyIgIlBob2VuaXgiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGVkaVBlZWtDb21wb25lbnQgPSBjb21wb25lbnQgIlBlZWsgY29tcG9uZW50IiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJIYW5kbGVzIHBlZWsgcmVxdWVzdHMgZnJvbSBhY3RvcnMiCiAgICAgICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkh0dHAgVHJpZ2dlciIKICAgICAgICAgICAgICAgICAgICAgICAgdGFncyAiTWljcm9zb2Z0IEF6dXJlIC0gRnVuY3Rpb24gQXBwcyIgIlBob2VuaXgiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZWRpRGIgIlN0b3JlcyBtZXNzYWdlcyBhbmQgYnVzaW5lc3MgdHJhbnNhY3Rpb25zIiAiRUYgQ29yZSwgRGFwcGVyIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlZGlEZXF1ZXVlQ29tcG9uZW50ID0gY29tcG9uZW50ICJEZXF1ZXVlIGNvbXBvbmVudCIgewogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiSGFuZGxlcyBkZXF1ZXVlIHJlcXVlc3RzIGZyb20gYWN0b3JzIgogICAgICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJIdHRwIFRyaWdnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEZ1bmN0aW9uIEFwcHMiICJQaG9lbml4IgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGVkaURiICJEZWxldGVzIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIHBlZWtlZCIgIkVGIENvcmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVkaVRpbWVTZXJpZXNSZXF1ZXN0ZXIgPSBjb21wb25lbnQgIlRpbWVTZXJpZXMgcmVxdWVzdCBjb21wb25lbnQiIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkZldGNoZXMgdGltZSBzZXJpZXMgZGF0YSBmcm9tIHJlbGV2YW50IGRvbWFpbiIKICAgICAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiPD8+IFRyaWdnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEZ1bmN0aW9uIEFwcHMiICJQaG9lbml4IgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGVkaURiICJXcml0ZXMgdGltZSBzZXJpZXMgZGF0YSB0byBkYXRhYmFzZSIgIkVGIENvcmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVkaVRpbWVTZXJpZXNMaXN0ZW5lciA9IGNvbXBvbmVudCAiVGltZVNlcmllcyBsaXN0ZW5lciIgewogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiTGlzdGVucyBmb3IgaW50ZWdyYXRpb24gZXZlbnRzIGluZGljYXRpbmcgdGltZSBzZXJpZXMgZGF0YSBpcyByZWFkeSIKICAgICAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiU2VydmljZSBCdXMgVHJpZ2dlciIKICAgICAgICAgICAgICAgICAgICAgICAgdGFncyAiTWljcm9zb2Z0IEF6dXJlIC0gRnVuY3Rpb24gQXBwcyIgIlBob2VuaXgiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIEJhc2UgbW9kZWwgcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRTZXJ2aWNlQnVzICJTdWJzY3JpYmVzIHRvIGludGVncmF0aW9uIGV2ZW50cyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgRG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBlZGlUaW1lU2VyaWVzUmVxdWVzdGVyICJUcmlnZ2VycyByZXF1ZXN0ZXIgdG8gZmV0Y2ggdGltZSBzZXJpZXMgZGF0YSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgQmFzZSBtb2RlbCByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgYWN0b3JCMkJTeXN0ZW0gLT4gdGhpcyAiUmVxdWVzdHMiIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFncyAiU2ltcGxlIFZpZXciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWRpQXBpID0gY29udGFpbmVyICJFREkgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFQSSBHYXRld2F5IHRvIEVESSBXZWIgQVBJIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkF6dXJlIEFQSSBNYW5hZ2VtZW50IFNlcnZpY2UiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiSW50ZXJtZWRpYXRlIFRlY2hub2xvZ3kiICJNaWNyb3NvZnQgQXp1cmUgLSBBUEkgTWFuYWdlbWVudCBTZXJ2aWNlcyIgIlBob2VuaXgiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgQmFzZSBtb2RlbCByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgYWN0b3JCMkJTeXN0ZW0gLT4gdGhpcyAiUmVxdWVzdHMgZWcuIFBlZWsgYW5kIERlcXVldWUiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgRG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGVkaVBlZWtDb21wb25lbnQgIlJlcXVlc3RzIgogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZWRpRGVxdWV1ZUNvbXBvbmVudCAiRGVxdWV1ZSBtZXNzYWdlcyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4tdG8tZG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRCMkMgIlZhbGlkYXRlIE9BdXRoIHRva2VuIiAiaHR0cHMiIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFncyAiT0F1dGgiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEluY2x1ZGUgV2hvbGVzYWxlIG1vZGVsCiAgICAgICAgICAgICMgUmVhZCBkZXNjcmlwdGlvbiBpbiB0aGUgJ3ZpZXdzLmRzbCcgZmlsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIHdob2xlc2FsZURvbWFpbiA9IGdyb3VwICJXaG9sZXNhbGUiIHsKICAgICAgICAgICAgICAgIHdob2xlc2FsZURhdGFMYWtlID0gY29udGFpbmVyICJEYXRhIExha2UgKFdob2xlc2FsZSkiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3RvcmVzIGJhdGNoIHJlc3VsdHMiCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiQXp1cmUgRGF0YSBMYWtlIEdlbiAyIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIkRhdGEgU3RvcmFnZSIgIk1pY3Jvc29mdCBBenVyZSAtIERhdGEgTGFrZSBTdG9yZSBHZW4xIiAiTWFuZGFsb3JpYW4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aG9sZXNhbGVDYWxjdWxhdG9yID0gY29udGFpbmVyICJDYWxjdWxhdGlvbiBFbmdpbmUiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRXhlY3V0ZXMgZW5lcmd5IGNhbGN1bGF0aW9ucyIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBenVyZSBEYXRhYnJpY2tzIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEF6dXJlIERhdGFicmlja3MiICJNYW5kYWxvcmlhbiIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gd2hvbGVzYWxlRGF0YUxha2UgIlJlYWQgLyB3cml0ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdob2xlc2FsZURiID0gY29udGFpbmVyICJXaG9sZXNhbGUgRGF0YWJhc2UiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3RvcmVzIGJhdGNoZXMgYW5kIG9wZXJhdGlvbnMgZGF0YSIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJTUUwgRGF0YWJhc2UgU2NoZW1hIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIkRhdGEgU3RvcmFnZSIgIk1pY3Jvc29mdCBBenVyZSAtIFNRTCBEYXRhYmFzZSIgIk1hbmRhbG9yaWFuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hvbGVzYWxlQXBpID0gY29udGFpbmVyICJXaG9sZXNhbGUgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkJhY2tlbmQgc2VydmVyIHByb3ZpZGluZyBleHRlcm5hbCB3ZWIgQVBJIGZvciB3aG9sZXNhbGUgb3BlcmF0aW9ucyIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBc3AuTmV0IENvcmUgV2ViIEFQSSIKICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBBcHAgU2VydmljZXMiICJNYW5kYWxvcmlhbiIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBCYXNlIG1vZGVsIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRTZXJ2aWNlQnVzICJTZW5kcyBjYWxjdWxhdGlvbnMiICJpbnRlZ3JhdGlvbiBldmVudC9hbXFwIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiB3aG9sZXNhbGVEYiAiVXNlcyIgIkVGIENvcmUiCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiB3aG9sZXNhbGVDYWxjdWxhdG9yICJTZW5kcyByZXF1ZXN0cyB0byIKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IHdob2xlc2FsZURhdGFMYWtlICJSZXRyaWV2ZXMgcmVzdWx0cyBmcm9tIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbi10by1kb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZWRpICJTZW5kcyBjYWxjdWxhdGlvbnMiICJpbnRlZ3JhdGlvbiBldmVudC9hbXFwIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIlNpbXBsZSBWaWV3IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJbmNsdWRlIEZyb250ZW5kIG1vZGVsLgogICAgICAgICAgICAjIFJlYWQgZGVzY3JpcHRpb24gaW4gdGhlICd2aWV3cy5kc2wnIGZpbGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBmcm9udGVuZERvbWFpbiA9IGdyb3VwICJGcm9udGVuZCIgewogICAgICAgICAgICAgICAgYmZmQXBwID0gY29udGFpbmVyICJCRkYgV2ViIEFQSSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCYWNrZW5kIGZvciBmcm9udGVuZCAoQkZGKSBjb21iaW5lcyBkYXRhIGZvciBwcmVzZW50YXRpb24gb24gRGF0YUh1YiAzIFVJIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkFzcC5OZXQgQ29yZSBXZWIgQVBJIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEFwcCBTZXJ2aWNlcyIgIk1hbmRhbG9yaWFuIiAiVGl0YW5zIiAiVUkvVVggR3VpbGQiIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbi10by1kb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gd2hvbGVzYWxlQXBpICJVc2VzIiAianNvbi9odHRwcyIKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IG1hcmtwYXJ0QXBpICJVc2VzIiAianNvbi9odHRwcyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJmZkFwaSA9IGNvbnRhaW5lciAiQkZGIEFQSSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBUEkgR2F0ZXdheSB0byBCRkYgV2ViIEFQSSIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBenVyZSBBUEkgTWFuYWdlbWVudCBTZXJ2aWNlIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIkludGVybWVkaWF0ZSBUZWNobm9sb2d5IiAiTWljcm9zb2Z0IEF6dXJlIC0gQVBJIE1hbmFnZW1lbnQgU2VydmljZXMiICJNYW5kYWxvcmlhbiIgIlRpdGFucyIgIlVJL1VYIEd1aWxkIiAiT3V0bGF3cyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gYmZmQXBwICJVc2VzIiAianNvbi9odHRwcyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4tdG8tZG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRCMkMgIlZhbGlkYXRlIE9BdXRoIHRva2VuIiAiaHR0cHMiIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFncyAiT0F1dGgiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnJvbnRlbmRTaW5nbGVQYWdlQXBwbGljYXRpb24gPSBjb250YWluZXIgIlVJIiB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlByb3ZpZGVzIERIMyBmdW5jdGlvbmFsaXR5IHRvIHVzZXJzIHZpYSB0aGVpciB3ZWIgYnJvd3Nlci4iCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiQW5ndWxhciIKICAgICAgICAgICAgICAgICAgICB0YWdzICJXZWIgQnJvd3NlciIgIk1hbmRhbG9yaWFuIiAiVGl0YW5zIiAiVUkvVVggR3VpbGQiIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIEJhc2UgbW9kZWwgcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIGRoM1VzZXIgLT4gdGhpcyAiVXNlcyIKICAgICAgICAgICAgICAgICAgICBkaFN5c3RlbUFkbWluIC0+IHRoaXMgIlZpZXdzIGFuZCBtYW5hZ2VzIGRhdGEgYWNyb3NzIGFsbCBhY3RvcnMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgRG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGJmZkFwaSAiVXNlcyBHcmFwaFFMIGFuZCBSRVNUZnVsIHNlcnZpY2VzIiAianNvbi9odHRwcyIKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGJmZkFwcCAiVXNlcyIgImpzb24vaHR0cHMiIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFncyAiU2ltcGxlIFZpZXciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbi10by1kb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZGgzLnNoYXJlZEIyQyAiUmVxdWVzdCBPQXV0aCB0b2tlbiIgImh0dHBzIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIk9BdXRoIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZyb250ZW5kU3RhdGljV2ViQXBwID0gY29udGFpbmVyICJTdGF0aWMgV2ViIEFwcCIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJEZWxpdmVycyB0aGUgc3RhdGljIGNvbnRlbnQgYW5kIHRoZSBVSSBzaW5nbGUgcGFnZSBhcHBsaWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJTdGF0aWMgV2ViIEFwcCIKICAgICAgICAgICAgICAgICAgICB0YWdzICJJbnRlcm1lZGlhdGUgVGVjaG5vbG9neSIgIk1pY3Jvc29mdCBBenVyZSAtIFN0YXRpYyBBcHBzIiAiTWFuZGFsb3JpYW4iICJUaXRhbnMiICJVSS9VWCBHdWlsZCIgCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgQmFzZSBtb2RlbCByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgZGgzVXNlciAtPiB0aGlzICJWaXNpdHMgREgzIHVybCIgImh0dHBzIgogICAgICAgICAgICAgICAgICAgIGRoU3lzdGVtQWRtaW4gLT4gdGhpcyAiVmlzaXRzIERIMyB1cmwiICJodHRwcyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZnJvbnRlbmRTaW5nbGVQYWdlQXBwbGljYXRpb24gIkRlbGl2ZXJzIHRvIHVzZXJzIHdlYiBicm93c2VyIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHZpZXdzIHsKICAgICAgICBjb250YWluZXIgZGgzICJGcm9udGVuZCIgewogICAgICAgICAgICB0aXRsZSAiW0NvbnRhaW5lcl0gRGF0YUh1YiAzLjAgLSBGcm9udGVuZCAoU2ltcGxpZmllZCkiCiAgICAgICAgICAgIGluY2x1ZGUgLT5mcm9udGVuZERvbWFpbi0+CiAgICAgICAgICAgIGV4Y2x1ZGUgInJlbGF0aW9uc2hpcC50YWc9PU9BdXRoIgogICAgICAgICAgICBleGNsdWRlICJlbGVtZW50LnRhZz09SW50ZXJtZWRpYXRlIFRlY2hub2xvZ3kiCiAgICAgICAgICAgIGV4Y2x1ZGUgZGgzLnNoYXJlZEIyQwogICAgICAgIH0KCiAgICAgICAgY29udGFpbmVyIGRoMyAiRnJvbnRlbmREZXRhaWxlZCIgewogICAgICAgICAgICB0aXRsZSAiW0NvbnRhaW5lcl0gRGF0YUh1YiAzLjAgLSBGcm9udGVuZCAoRGV0YWlsZWQgd2l0aCBPQXV0aCkiCiAgICAgICAgICAgIGluY2x1ZGUgLT5mcm9udGVuZERvbWFpbi0+CiAgICAgICAgICAgIGV4Y2x1ZGUgInJlbGF0aW9uc2hpcC50YWc9PVNpbXBsZSBWaWV3IgogICAgICAgIH0KICAgIH0KfQo=" + "id" : 1, + "name" : "DataHub", + "description" : "Description", + "lastModifiedDate" : "2023-09-04T12:00:13Z", + "lastModifiedAgent" : "structurizr-javascript", + "properties" : { + "structurizr.dsl" : "IyBUaGUgJ3ZpZXdzLmRzbCcgZmlsZSBpcyBpbnRlbmRlZCBhcyBhIG1lYW4gZm9yIHZpZXdpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIG1vZGVsCiMgaW4gdGhlIGRvbWFpbiByZXBvc2l0b3J5LiBJdCBzaG91bGQKIyAgICogRXh0ZW5kIHRoZSBiYXNlIG1vZGVsIGFuZCBvdmVycmlkZSB0aGUgJ2RoMycgc29mdHdhcmUgc3lzdGVtCiMgICAqIEluY2x1ZGUgb2YgdGhlIGBtb2RlbC5kc2xgIGZpbGVzIGZyb20gZWFjaCBkb21haW4gcmVwb3NpdG9yeSB1c2luZyBhbiBVUkwKIwojIFRoZSBgbW9kZWwuZHNsYCBmaWxlIG11c3QgY29udGFpbiB0aGUgYWN0dWFsIG1vZGVsLCBhbmQgaXMgdGhlIHBpZWNlIHRoYXQgbXVzdAojIGJlIHJldXNhYmxlIGFuZCBpbmNsdWRlZCBpbiBvdGhlciBTdHJ1Y3R1cml6ciBmaWxlcyBsaWtlIGB2aWV3cy5kc2xgIGFuZAojIGRlcGxveW1lbnQgZGlhZ3JhbSBmaWxlcy4KCndvcmtzcGFjZSBleHRlbmRzIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9FbmVyZ2luZXQtRGF0YUh1Yi9vcGVuZ2VoLWFyY2gtZGlhZ3JhbXMvbWFpbi9kb2NzL2RpYWdyYW1zL2M0LW1vZGVsL2RoLWJhc2UtbW9kZWwuZHNsIHsKCiAgICBtb2RlbCB7CiAgICAgICAgIwogICAgICAgICMgRGF0YUh1YiAzLjAgKGV4dGVuZHMpCiAgICAgICAgIwogICAgICAgICFyZWYgZGgzIHsKCiAgICAgICAgICAgICMgSU1QT1JUQU5UOgogICAgICAgICAgICAjIFRoZSBvcmRlciBieSB3aGljaCBtb2RlbHMgYXJlIGluY2x1ZGVkIGlzIGltcG9ydGFudCBmb3IgaG93IHRoZSBkb21haW4tdG8tZG9tYWluIHJlbGF0aW9uc2hpcHMgYXJlIHNwZWNpZmllZC4KICAgICAgICAgICAgIyBBIGRvbWFpbi10by1kb21haW4gcmVsYXRpb25zaGlwIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlICJjbGllbnQiIG9mIGEgImNsaWVudC0+c2VydmVyIiBkZXBlbmRlbmN5LCBhbmQKICAgICAgICAgICAgIyBoZW5jZSBkb21haW5zIHRoYXQgZG9lc24ndCBkZXBlbmQgb24gb3RoZXJzLCBzaG91bGQgYmUgbGlzdGVkIGZpcnN0LgoKICAgICAgICAgICAgIyBJbmNsdWRlIE1hcmtldCBQYXJ0aWNpcGFudCBtb2RlbAogICAgICAgICAgICAjIFJlYWQgZGVzY3JpcHRpb24gaW4gdGhlICd2aWV3cy5kc2wnIGZpbGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBtYXJrcGFydERvbWFpbiA9IGdyb3VwICJNYXJrZXQgUGFydGljaXBhbnQiIHsKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgQ29tbW9uIChtYW5hZ2VkIGJ5IE1hcmtldCBQYXJ0aWNpcGFudCkKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgIyBEb21haW4KICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIG1hcmtwYXJ0RGIgPSBjb250YWluZXIgIkFjdG9ycyBEYXRhYmFzZSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTdG9yZXMgZGF0YSByZWdhcmRpbmcgYWN0b3JzLCB1c2VycyBhbmQgcGVybWlzc2lvbnMuIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlNRTCBEYXRhYmFzZSBTY2hlbWEiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiRGF0YSBTdG9yYWdlIiAiTWljcm9zb2Z0IEF6dXJlIC0gU1FMIERhdGFiYXNlIiAiVGl0YW5zIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWFya3BhcnRLZXlWYXVsdCA9IGNvbnRhaW5lciAiTWFya2V0IFBhcnRpY2lwYW50IEludGVybmFsIEtleSBWYXVsdCIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJTdG9yZXMga2V5IHVzZWQgZm9yIHNpZ25pbmcgdG9rZW5zLiIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBenVyZSBLZXkgVmF1bHQiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiTWljcm9zb2Z0IEF6dXJlIC0gS2V5IFZhdWx0cyIgIlRpdGFucyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcmtwYXJ0QXBpID0gY29udGFpbmVyICJNYXJrZXQgUGFydGljaXBhbnQgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIk11bHRpLXRlbmFudCBBUEkgZm9yIG1hbmFnaW5nIGFjdG9ycywgdXNlcnMgYW5kIHBlcm1pc3Npb25zLiIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBc3AuTmV0IENvcmUgV2ViIEFQSSIKICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBBcHAgU2VydmljZXMiICJUaXRhbnMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgQ29tbW9uIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRCMkMgIkNyZWF0ZXMgYW5kIG1hbmFnZXMgQjJDIHVzZXJzIiAiTWljcm9zb2Z0LkdyYXBoL2h0dHBzIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBtYXJrcGFydERiICJSZWFkcyBhbmQgd3JpdGVzIGFjdG9yL3VzZXIgZGF0YS4iICJFRiBDb3JlIgogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gbWFya3BhcnRLZXlWYXVsdCAiU2lnbnMsIGFuZCByZWFkcyBwdWJsaWMga2V5IGZvciwgdG9rZW5zLiIgIk1pY3Jvc29mdC5HcmFwaC9odHRwcyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hcmtwYXJ0T3JnYW5pemF0aW9uTWFuYWdlciA9IGNvbnRhaW5lciAiTWFya2V0IFBhcnRpY2lwYW50IDxPcmdhbml6YXRpb24gTWFuYWdlcj4iIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3luY2hyb25pemVzIEF6dXJlIEIyQyB1c2VyIGFuZCBhY3RvciBzdGF0ZSB3aXRoIHRoZSBkb21haW4uIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkF6dXJlIGZ1bmN0aW9uLCBDIyIKICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBGdW5jdGlvbiBBcHBzIiAiVGl0YW5zIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBtYXJrcGFydEV2ZW50QWN0b3JTeW5jaHJvbml6ZXIgPSBjb21wb25lbnQgIkFjdG9yIFN5bmNocm9uaXplciIgewogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiQ3JlYXRlcyBCMkMgYXBwbGljYXRpb24gcmVnaXN0cmF0aW9uIGZvciBuZXdseSBjcmVhdGVkIGFjdG9ycy4iCiAgICAgICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlRpbWVyIFRyaWdnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEZ1bmN0aW9uIEFwcHMiICJUaXRhbnMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIENvbW1vbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZGgzLnNoYXJlZEIyQyAiQ3JlYXRlcyBCMkMgQXBwIFJlZ2lzdHJhdGlvbiIgIk1pY3Jvc29mdC5HcmFwaC9odHRwcyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgRG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBtYXJrcGFydERiICJVcGRhdGVzIGFjdG9ycyB3aXRoIGV4dGVybmFsIEIyQyBpZC4iICJFRiBDb3JlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtYXJrcGFydE1haWxEaXNwYXRjaGVyID0gY29tcG9uZW50ICJNYWlsIERpc3BhdGNoZXIiIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHVzZXIgaW52aXRhdGlvbnMuIgogICAgICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJUaW1lciBUcmlnZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBGdW5jdGlvbiBBcHBzIiAiVGl0YW5zIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBDb21tb24gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRTZW5kR3JpZCAiU2VuZHMgaW52aXRhdGlvbiBtYWlsIiAiU2VuZEdyaWQvaHR0cHMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gbWFya3BhcnREYiAiUmVhZHMgZGF0YSByZWdhcmRpbmcgbmV3bHkgaW52aXRlZCB1c2Vycy4iICJFRiBDb3JlIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJbmNsdWRlIEVESSBtb2RlbAogICAgICAgICAgICAjIFJlYWQgZGVzY3JpcHRpb24gaW4gdGhlICd2aWV3cy5kc2wnIGZpbGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBlZGlEb21haW4gPSBncm91cCAiRURJIiB7CiAgICAgICAgICAgICAgICBlZGlEYiA9IGNvbnRhaW5lciAiRURJIERhdGFiYXNlIiB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIlN0b3JlcyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIEVESSBvcGVyYXRpb25zIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlNRTCBTZXJ2ZXIiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiRGF0YSBTdG9yYWdlLCBNaWNyb3NvZnQgQXp1cmUgLSBTUUwgRGF0YWJhc2UiICJNb3NhaWMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlZGkgPSBjb250YWluZXIgIkVESSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCYWNrZW5kIHNlcnZlciBwcm92aWRpbmcgQVBJIGZvciBFREkgb3BlcmF0aW9ucyIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBenVyZSBmdW5jdGlvbiwgQyMiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiTWljcm9zb2Z0IEF6dXJlIC0gRnVuY3Rpb24gQXBwcyIgIk1vc2FpYyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZWRpUGVla0NvbXBvbmVudCA9IGNvbXBvbmVudCAiUGVlayBjb21wb25lbnQiIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkhhbmRsZXMgcGVlayByZXF1ZXN0cyBmcm9tIGFjdG9ycyIKICAgICAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiSHR0cCBUcmlnZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBGdW5jdGlvbiBBcHBzIiAiTW9zYWljIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGVkaURiICJTdG9yZXMgbWVzc2FnZXMgYW5kIGJ1c2luZXNzIHRyYW5zYWN0aW9ucyIgIkVGIENvcmUsIERhcHBlciIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWRpRGVxdWV1ZUNvbXBvbmVudCA9IGNvbXBvbmVudCAiRGVxdWV1ZSBjb21wb25lbnQiIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkhhbmRsZXMgZGVxdWV1ZSByZXF1ZXN0cyBmcm9tIGFjdG9ycyIKICAgICAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiSHR0cCBUcmlnZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBGdW5jdGlvbiBBcHBzIiAiTW9zYWljIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGVkaURiICJEZWxldGVzIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIHBlZWtlZCIgIkVGIENvcmUiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVkaVRpbWVTZXJpZXNSZXF1ZXN0ZXIgPSBjb21wb25lbnQgIlRpbWVTZXJpZXMgcmVxdWVzdCBjb21wb25lbnQiIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkZldGNoZXMgdGltZSBzZXJpZXMgZGF0YSBmcm9tIHJlbGV2YW50IGRvbWFpbiIKICAgICAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiPD8+IFRyaWdnZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEZ1bmN0aW9uIEFwcHMiICJNb3NhaWMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZWRpRGIgIldyaXRlcyB0aW1lIHNlcmllcyBkYXRhIHRvIGRhdGFiYXNlIiAiRUYgQ29yZSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWRpVGltZVNlcmllc0xpc3RlbmVyID0gY29tcG9uZW50ICJUaW1lU2VyaWVzIGxpc3RlbmVyIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJMaXN0ZW5zIGZvciBpbnRlZ3JhdGlvbiBldmVudHMgaW5kaWNhdGluZyB0aW1lIHNlcmllcyBkYXRhIGlzIHJlYWR5IgogICAgICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJTZXJ2aWNlIEJ1cyBUcmlnZ2VyIgogICAgICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBGdW5jdGlvbiBBcHBzIiAiTW9zYWljIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCYXNlIG1vZGVsIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBkaDMuc2hhcmVkU2VydmljZUJ1cyAiU3Vic2NyaWJlcyB0byBpbnRlZ3JhdGlvbiBldmVudHMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZWRpVGltZVNlcmllc1JlcXVlc3RlciAiVHJpZ2dlcnMgcmVxdWVzdGVyIHRvIGZldGNoIHRpbWUgc2VyaWVzIGRhdGEiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIEJhc2UgbW9kZWwgcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIGFjdG9yQjJCU3lzdGVtIC0+IHRoaXMgIlJlcXVlc3RzIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIlNpbXBsZSBWaWV3IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVkaUFwaSA9IGNvbnRhaW5lciAiRURJIEFQSSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJBUEkgR2F0ZXdheSBwb2xpY2llcyBmb3IgRURJIFdlYiBBUEkiCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiQXp1cmUgQVBJIE1hbmFnZW1lbnQgU2VydmljZSIKICAgICAgICAgICAgICAgICAgICB0YWdzICJJbnRlcm1lZGlhdGUgVGVjaG5vbG9neSIgIk1pY3Jvc29mdCBBenVyZSAtIEFQSSBNYW5hZ2VtZW50IFNlcnZpY2VzIiAiTW9zYWljIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIEJhc2UgbW9kZWwgcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIGFjdG9yQjJCU3lzdGVtIC0+IHRoaXMgIlJlcXVlc3RzIGVnLiBQZWVrIGFuZCBEZXF1ZXVlIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBlZGlQZWVrQ29tcG9uZW50ICJSZXF1ZXN0cyIKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGVkaURlcXVldWVDb21wb25lbnQgIkRlcXVldWUgbWVzc2FnZXMiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgRG9tYWluLXRvLWRvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBkaDMuc2hhcmVkQjJDICJWYWxpZGF0ZSBjcmVkZW50aWFscyIgImh0dHBzIiB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEluY2x1ZGUgV2hvbGVzYWxlIG1vZGVsCiAgICAgICAgICAgICMgUmVhZCBkZXNjcmlwdGlvbiBpbiB0aGUgJ3ZpZXdzLmRzbCcgZmlsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIHdob2xlc2FsZURvbWFpbiA9IGdyb3VwICJXaG9sZXNhbGUiIHsKICAgICAgICAgICAgICAgIHdob2xlc2FsZURhdGFMYWtlID0gY29udGFpbmVyICJEYXRhIExha2UgKFdob2xlc2FsZSkiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3RvcmVzIGJhdGNoIHJlc3VsdHMiCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiQXp1cmUgRGF0YSBMYWtlIEdlbiAyIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIkRhdGEgU3RvcmFnZSIgIk1pY3Jvc29mdCBBenVyZSAtIERhdGEgTGFrZSBTdG9yZSBHZW4xIiAiTWFuZGFsb3JpYW4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aG9sZXNhbGVDYWxjdWxhdG9yID0gY29udGFpbmVyICJDYWxjdWxhdGlvbiBFbmdpbmUiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRXhlY3V0ZXMgZW5lcmd5IGNhbGN1bGF0aW9ucyIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBenVyZSBEYXRhYnJpY2tzIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEF6dXJlIERhdGFicmlja3MiICJNYW5kYWxvcmlhbiIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gd2hvbGVzYWxlRGF0YUxha2UgIlJlYWQgLyB3cml0ZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdob2xlc2FsZURiID0gY29udGFpbmVyICJXaG9sZXNhbGUgRGF0YWJhc2UiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiU3RvcmVzIGJhdGNoZXMgYW5kIG9wZXJhdGlvbnMgZGF0YSIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJTUUwgRGF0YWJhc2UgU2NoZW1hIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIkRhdGEgU3RvcmFnZSIgIk1pY3Jvc29mdCBBenVyZSAtIFNRTCBEYXRhYmFzZSIgIk1hbmRhbG9yaWFuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hvbGVzYWxlQXBpID0gY29udGFpbmVyICJXaG9sZXNhbGUgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkJhY2tlbmQgc2VydmVyIHByb3ZpZGluZyBleHRlcm5hbCB3ZWIgQVBJIGZvciB3aG9sZXNhbGUgb3BlcmF0aW9ucyIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBc3AuTmV0IENvcmUgV2ViIEFQSSIKICAgICAgICAgICAgICAgICAgICB0YWdzICJNaWNyb3NvZnQgQXp1cmUgLSBBcHAgU2VydmljZXMiICJNYW5kYWxvcmlhbiIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBCYXNlIG1vZGVsIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRTZXJ2aWNlQnVzICJTZW5kcyBjYWxjdWxhdGlvbnMiICJpbnRlZ3JhdGlvbiBldmVudC9hbXFwIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiB3aG9sZXNhbGVEYiAiVXNlcyIgIkVGIENvcmUiCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiB3aG9sZXNhbGVDYWxjdWxhdG9yICJTZW5kcyByZXF1ZXN0cyB0byIKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IHdob2xlc2FsZURhdGFMYWtlICJSZXRyaWV2ZXMgcmVzdWx0cyBmcm9tIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbi10by1kb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZWRpICJTZW5kcyBjYWxjdWxhdGlvbnMiICJpbnRlZ3JhdGlvbiBldmVudC9hbXFwIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIlNpbXBsZSBWaWV3IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJbmNsdWRlIEZyb250ZW5kIG1vZGVsLgogICAgICAgICAgICAjIFJlYWQgZGVzY3JpcHRpb24gaW4gdGhlICd2aWV3cy5kc2wnIGZpbGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBlU2V0dERvbWFpbiA9IGdyb3VwICJlU2V0dCBFeGNoYW5nZSIgewogICAgICAgICAgICAgICAgZVNldHRBcGkgPSBjb250YWluZXIgImVTZXR0IEV4Y2hhbmdlIFdlYkFQSSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJlU2V0dCBleGNoYW5nZSBBUEkiCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiQXNwLk5ldCBDb3JlIFdlYiBBUEkiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiTWljcm9zb2Z0IEF6dXJlIC0gQXBwIFNlcnZpY2VzIiAiVGl0YW5zIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBmcm9udGVuZERvbWFpbiA9IGdyb3VwICJGcm9udGVuZCIgewogICAgICAgICAgICAgICAgYmZmQXBwID0gY29udGFpbmVyICJCRkYgV2ViIEFQSSIgewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICJCYWNrZW5kIGZvciBmcm9udGVuZCAoQkZGKSBjb21iaW5lcyBkYXRhIGZvciBwcmVzZW50YXRpb24gb24gRGF0YUh1YiAzIFVJIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkFzcC5OZXQgQ29yZSBXZWIgQVBJIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIk1pY3Jvc29mdCBBenVyZSAtIEFwcCBTZXJ2aWNlcyIgIk1hbmRhbG9yaWFuIiAiVGl0YW5zIiAiVUkvVVggR3VpbGQiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgRG9tYWluLXRvLWRvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiB3aG9sZXNhbGVBcGkgIlVzZXMiICJqc29uL2h0dHBzIgogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gbWFya3BhcnRBcGkgIlVzZXMiICJqc29uL2h0dHBzIgogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZVNldHRBcGkgIlVzZXMiICJqc29uL2h0dHBzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYmZmQXBpID0gY29udGFpbmVyICJCRkYgQVBJIiB7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gIkFQSSBHYXRld2F5IHRvIEJGRiBXZWIgQVBJIgogICAgICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIkF6dXJlIEFQSSBNYW5hZ2VtZW50IFNlcnZpY2UiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiSW50ZXJtZWRpYXRlIFRlY2hub2xvZ3kiICJNaWNyb3NvZnQgQXp1cmUgLSBBUEkgTWFuYWdlbWVudCBTZXJ2aWNlcyIgIk1hbmRhbG9yaWFuIiAiVGl0YW5zIiAiVUkvVVggR3VpbGQiICJPdXRsYXdzIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBiZmZBcHAgIlVzZXMiICJqc29uL2h0dHBzIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbi10by1kb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZGgzLnNoYXJlZEIyQyAiVmFsaWRhdGUgT0F1dGggdG9rZW4iICJodHRwcyIgewogICAgICAgICAgICAgICAgICAgICAgICB0YWdzICJPQXV0aCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcm9udGVuZFNpbmdsZVBhZ2VBcHBsaWNhdGlvbiA9IGNvbnRhaW5lciAiVUkiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiUHJvdmlkZXMgREgzIGZ1bmN0aW9uYWxpdHkgdG8gdXNlcnMgdmlhIHRoZWlyIHdlYiBicm93c2VyLiIKICAgICAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJBbmd1bGFyIgogICAgICAgICAgICAgICAgICAgIHRhZ3MgIldlYiBCcm93c2VyIiAiTWFuZGFsb3JpYW4iICJUaXRhbnMiICJVSS9VWCBHdWlsZCIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBCYXNlIG1vZGVsIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICBkaDNVc2VyIC0+IHRoaXMgIlVzZXMiCiAgICAgICAgICAgICAgICAgICAgZGhTeXN0ZW1BZG1pbiAtPiB0aGlzICJWaWV3cyBhbmQgbWFuYWdlcyBkYXRhIGFjcm9zcyBhbGwgYWN0b3JzIgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIERvbWFpbiByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBiZmZBcGkgIlVzZXMgR3JhcGhRTCBhbmQgUkVTVGZ1bCBzZXJ2aWNlcyIgImpzb24vaHR0cHMiCiAgICAgICAgICAgICAgICAgICAgdGhpcyAtPiBiZmZBcHAgIlVzZXMiICJqc29uL2h0dHBzIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MgIlNpbXBsZSBWaWV3IgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4tdG8tZG9tYWluIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgICAgICAgICB0aGlzIC0+IGRoMy5zaGFyZWRCMkMgIlJlcXVlc3QgT0F1dGggdG9rZW4iICJodHRwcyIgewogICAgICAgICAgICAgICAgICAgICAgICB0YWdzICJPQXV0aCIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcm9udGVuZFN0YXRpY1dlYkFwcCA9IGNvbnRhaW5lciAiU3RhdGljIFdlYiBBcHAiIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiAiRGVsaXZlcnMgdGhlIHN0YXRpYyBjb250ZW50IGFuZCB0aGUgVUkgc2luZ2xlIHBhZ2UgYXBwbGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgdGVjaG5vbG9neSAiU3RhdGljIFdlYiBBcHAiCiAgICAgICAgICAgICAgICAgICAgdGFncyAiSW50ZXJtZWRpYXRlIFRlY2hub2xvZ3kiICJNaWNyb3NvZnQgQXp1cmUgLSBTdGF0aWMgQXBwcyIgIk1hbmRhbG9yaWFuIiAiVGl0YW5zIiAiVUkvVVggR3VpbGQiCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICMgQmFzZSBtb2RlbCByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgICAgICAgICAgZGgzVXNlciAtPiB0aGlzICJWaXNpdHMgREgzIHVybCIgImh0dHBzIgogICAgICAgICAgICAgICAgICAgIGRoU3lzdGVtQWRtaW4gLT4gdGhpcyAiVmlzaXRzIERIMyB1cmwiICJodHRwcyIKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIyBEb21haW4gcmVsYXRpb25zaGlwcwogICAgICAgICAgICAgICAgICAgIHRoaXMgLT4gZnJvbnRlbmRTaW5nbGVQYWdlQXBwbGljYXRpb24gIkRlbGl2ZXJzIHRvIHVzZXJzIHdlYiBicm93c2VyIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHZpZXdzIHsKICAgICAgICBjb250YWluZXIgZGgzICJGcm9udGVuZCIgewogICAgICAgICAgICB0aXRsZSAiW0NvbnRhaW5lcl0gRGF0YUh1YiAzLjAgLSBGcm9udGVuZCAoU2ltcGxpZmllZCkiCiAgICAgICAgICAgIGluY2x1ZGUgLT5mcm9udGVuZERvbWFpbi0+CiAgICAgICAgICAgIGV4Y2x1ZGUgInJlbGF0aW9uc2hpcC50YWc9PU9BdXRoIgogICAgICAgICAgICBleGNsdWRlICJlbGVtZW50LnRhZz09SW50ZXJtZWRpYXRlIFRlY2hub2xvZ3kiCiAgICAgICAgICAgIGV4Y2x1ZGUgZGgzLnNoYXJlZEIyQwogICAgICAgIH0KCiAgICAgICAgY29udGFpbmVyIGRoMyAiRnJvbnRlbmREZXRhaWxlZCIgewogICAgICAgICAgICB0aXRsZSAiW0NvbnRhaW5lcl0gRGF0YUh1YiAzLjAgLSBGcm9udGVuZCAoRGV0YWlsZWQgd2l0aCBPQXV0aCkiCiAgICAgICAgICAgIGluY2x1ZGUgLT5mcm9udGVuZERvbWFpbi0+CiAgICAgICAgICAgIGV4Y2x1ZGUgInJlbGF0aW9uc2hpcC50YWc9PVNpbXBsZSBWaWV3IgogICAgICAgIH0KICAgIH0KfQo=" }, - "configuration": {}, - "model": { - "people": [ - { - "id": "1", - "tags": "Element,Person", - "properties": { - "structurizr.dsl.identifier": "dh3user" - }, - "name": "DH3 User", - "description": "Person who interacts with DataHub", - "relationships": [ - { - "id": "31", - "tags": "Relationship", - "sourceId": "1", - "destinationId": "17", - "description": "Uses", - "technology": "browser" - }, - { - "id": "98", - "tags": "Relationship", - "sourceId": "1", - "destinationId": "97", - "description": "Visits DH3 url", - "technology": "https" - }, - { - "id": "92", - "tags": "Relationship", - "sourceId": "1", - "destinationId": "91", - "description": "Uses" - } - ], - "group": "Electricity Supplier or Grid Company", - "location": "Unspecified" + "configuration" : { }, + "model" : { + "people" : [ { + "id" : "6", + "tags" : "Element,Person", + "properties" : { + "structurizr.dsl.identifier" : "energyoriginuser" }, - { - "id": "6", - "tags": "Element,Person", - "properties": { - "structurizr.dsl.identifier": "energyoriginuser" + "name" : "Energy Origin user", + "description" : "Person who on behalf of a power producer/consumer interacts with Energy Origin.", + "relationships" : [ { + "id" : "41", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "b8377f65-0867-46c1-8721-d4ff484f2893" }, - "name": "Energy Origin user", - "description": "Person who on behalf of a power producer/consumer interacts with Energy Origin.", - "relationships": [ - { - "id": "40", - "tags": "Relationship", - "sourceId": "6", - "destinationId": "15", - "description": "Reads/manages granular certificates", - "technology": "browser" - } - ], - "group": "Business or private person", - "location": "Unspecified" + "sourceId" : "6", + "destinationId" : "15", + "description" : "Reads/manages granular certificates", + "technology" : "browser" + } ], + "group" : "Business or private person", + "location" : "Unspecified" + }, { + "id" : "1", + "tags" : "Element,Person", + "properties" : { + "structurizr.dsl.identifier" : "dh3user" }, - { - "id": "3", - "tags": "Element,Person", - "properties": { - "structurizr.dsl.identifier": "eloverblikuser" + "name" : "DH3 User", + "description" : "Person who interacts with DataHub", + "relationships" : [ { + "id" : "98", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "5c1b63e0-aabc-41f7-9b52-71830967b89f" }, - "name": "ElOverblik user", - "description": "Person who interacts with ElOverblik. Both private and business users.", - "relationships": [ - { - "id": "34", - "tags": "Relationship", - "sourceId": "3", - "destinationId": "14", - "description": "Requests ", - "technology": "browser" - } - ], - "group": "Business or private person", - "location": "Unspecified" - }, - { - "id": "13", - "tags": "Element,Person", - "properties": { - "structurizr.dsl.identifier": "dhsystemadmin" + "sourceId" : "1", + "destinationId" : "97", + "description" : "Uses" + }, { + "id" : "104", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "efd2379e-cc63-4243-b368-554cae3d3589" }, - "name": "DataHub System Admin", - "description": "Person who works within Energinet DataHub", - "relationships": [ - { - "id": "27", - "tags": "Relationship", - "sourceId": "13", - "destinationId": "16", - "description": "Monitors", - "technology": "browser" - }, - { - "id": "99", - "tags": "Relationship", - "sourceId": "13", - "destinationId": "97", - "description": "Visits DH3 url", - "technology": "https" - }, - { - "id": "93", - "tags": "Relationship", - "sourceId": "13", - "destinationId": "91", - "description": "Views and manages data across all actors" - }, - { - "id": "30", - "tags": "Relationship", - "sourceId": "13", - "destinationId": "17", - "description": "Uses", - "technology": "browser" - } - ], - "group": "Energinet Organization/DataHub Organization", - "location": "Unspecified" - } - ], - "softwareSystems": [ - { - "id": "11", - "tags": "Element,Software System,Out of focus", - "properties": { - "structurizr.dsl.identifier": "eds" + "sourceId" : "1", + "destinationId" : "103", + "description" : "Visits DH3 url", + "technology" : "https" + }, { + "id" : "32", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "aba00f00-1f7c-446f-9453-d719f619d03d" }, - "name": "Energi Data Service", - "description": "Data and services about the Danish energy system such as CO2 emissions and consumption and production data.", - "group": "Energinet Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "1", + "destinationId" : "17", + "description" : "Uses", + "technology" : "browser" + } ], + "group" : "Electricity Supplier or Grid Company", + "location" : "Unspecified" + }, { + "id" : "3", + "tags" : "Element,Person", + "properties" : { + "structurizr.dsl.identifier" : "eloverblikuser" }, - { - "id": "5", - "tags": "Element,Software System,Actor", - "properties": { - "structurizr.dsl.identifier": "energyoriginthirdpartysystem" + "name" : "ElOverblik user", + "description" : "Person who interacts with ElOverblik. Both private and business users.", + "relationships" : [ { + "id" : "35", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "3c479a5b-4059-4b7b-9b37-6872594b37e7" }, - "name": "Energy Origin Third Party", - "description": "Third party system that interacts with Energy Origin APIs.", - "relationships": [ - { - "id": "41", - "tags": "Relationship", - "sourceId": "5", - "destinationId": "15", - "description": "Integrates with platform on behalf of users", - "technology": "https" - } - ], - "group": "Business or private person", - "location": "Unspecified", - "documentation": {} + "sourceId" : "3", + "destinationId" : "14", + "description" : "Requests ", + "technology" : "browser" + } ], + "group" : "Business or private person", + "location" : "Unspecified" + }, { + "id" : "13", + "tags" : "Element,Person", + "properties" : { + "structurizr.dsl.identifier" : "dhsystemadmin" }, - { - "id": "14", - "tags": "Element,Software System", - "properties": { - "structurizr.dsl.identifier": "eloverblik" + "name" : "DataHub System Admin", + "description" : "Person who works within Energinet DataHub", + "relationships" : [ { + "id" : "31", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "9660b287-8abb-4865-b60c-68f1d70b25da" }, - "name": "Eloverblik", - "description": "The platform provides data on electricity consumption and production, allowing customers to have a comprehensive overview across grid areas and energy suppliers.", - "relationships": [ - { - "id": "35", - "tags": "Relationship", - "sourceId": "14", - "destinationId": "11", - "description": "Requests emission and residual mix data", - "technology": "https" - }, - { - "id": "29", - "tags": "Relationship", - "sourceId": "14", - "destinationId": "7", - "description": "Requests ", - "technology": "https" - } - ], - "group": "Energinet Organization/DataHub Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "13", + "destinationId" : "17", + "description" : "Uses", + "technology" : "browser" + }, { + "id" : "28", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "cb76ec6e-1e16-467c-a9a6-192bff9cc704" + }, + "sourceId" : "13", + "destinationId" : "16", + "description" : "Monitors", + "technology" : "browser" + }, { + "id" : "99", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "641d9a35-f105-435e-b759-94a8d1037da4" + }, + "sourceId" : "13", + "destinationId" : "97", + "description" : "Views and manages data across all actors" + }, { + "id" : "105", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "ccc9f102-0eb4-4a7c-9a33-9b4e97b25a18" + }, + "sourceId" : "13", + "destinationId" : "103", + "description" : "Visits DH3 url", + "technology" : "https" + } ], + "group" : "Energinet Organization/DataHub Organization", + "location" : "Unspecified" + } ], + "softwareSystems" : [ { + "id" : "14", + "tags" : "Element,Software System", + "properties" : { + "structurizr.dsl.identifier" : "eloverblik" }, - { - "id": "9", - "tags": "Element,Software System,Out of focus", - "properties": { - "structurizr.dsl.identifier": "mitid" + "name" : "Eloverblik", + "description" : "The platform provides data on electricity consumption and production, allowing customers to have a comprehensive overview across grid areas and energy suppliers.", + "relationships" : [ { + "id" : "36", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "ea78fa05-22be-41c9-a17d-834dc7057465" }, - "name": "MitID", - "description": "MitID is a common login solution for the public sector in Denmark.", - "group": "Signaturgruppen Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "14", + "destinationId" : "11", + "description" : "Requests emission and residual mix data", + "technology" : "https" + }, { + "id" : "30", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "07a54e0f-7dd0-4574-9a7c-e0f21a37085b" + }, + "sourceId" : "14", + "destinationId" : "7", + "description" : "Requests ", + "technology" : "https" + } ], + "group" : "Energinet Organization/DataHub Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "9", + "tags" : "Element,Software System,Out of focus", + "properties" : { + "structurizr.dsl.identifier" : "mitid" + }, + "name" : "MitID", + "description" : "MitID is a common login solution for the public sector in Denmark.", + "group" : "Signaturgruppen Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "5", + "tags" : "Element,Software System,Actor", + "properties" : { + "structurizr.dsl.identifier" : "energyoriginthirdpartysystem" }, - { - "id": "12", - "tags": "Element,Software System,Out of focus", - "properties": { - "structurizr.dsl.identifier": "po" + "name" : "Energy Origin Third Party", + "description" : "Third party system that interacts with Energy Origin APIs.", + "relationships" : [ { + "id" : "42", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "f90fc90d-758f-4814-813f-485558b53ffe" }, - "name": "Project Origin", - "description": "Public permissioned distributed ledger where everyone can validate the Guarantee of Origin for their electricity.", - "group": "Energinet Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "5", + "destinationId" : "15", + "description" : "Integrates with platform on behalf of users", + "technology" : "https" + } ], + "group" : "Business or private person", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "16", + "tags" : "Element,Software System", + "properties" : { + "structurizr.dsl.identifier" : "dhesett" }, - { - "id": "8", - "tags": "Element,Software System,Out of focus", - "properties": { - "structurizr.dsl.identifier": "esett" + "name" : "DataHub eSett", + "description" : "Converts ebix messages, which contain aggregated energy time series, into a format eSett understands (nbs).", + "relationships" : [ { + "id" : "26", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "6e216449-777a-433b-8044-592071936e76" + }, + "sourceId" : "16", + "destinationId" : "10", + "description" : "Sends calculations", + "technology" : "https" + }, { + "id" : "29", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "981f1f2e-82ba-42b2-ad1e-99bef920a453" }, - "name": "eSett", - "description": "Balance settlement system for the Nordic electricity market.", - "group": "eSett Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "16", + "destinationId" : "7", + "description" : "Requests ", + "technology" : "peek+dequeue/https" + } ], + "group" : "Energinet Organization/DataHub Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "10", + "tags" : "Element,Software System,Out of focus", + "properties" : { + "structurizr.dsl.identifier" : "btesett" }, - { - "id": "7", - "tags": "Element,Software System,Out of focus", - "properties": { - "structurizr.dsl.identifier": "dh2" + "name" : "BizTalk eSett", + "description" : "Handles communication and network between Energinet and eSett.", + "relationships" : [ { + "id" : "27", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "ad494a84-791c-4542-a06a-9803bc501a6d" }, - "name": "DataHub 2.0", - "description": "Existing DataHub system. Provides uniform communication and standardized processes for actors operating on the Danish electricity market.", - "relationships": [ - { - "id": "33", - "tags": "Relationship", - "sourceId": "7", - "destinationId": "17", - "description": "Transfers ", - "technology": "AzCopy/https" - } - ], - "group": "CGI Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "10", + "destinationId" : "8", + "description" : "Sends calculations", + "technology" : "" + } ], + "group" : "Energinet Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "11", + "tags" : "Element,Software System,Out of focus", + "properties" : { + "structurizr.dsl.identifier" : "eds" }, - { - "id": "2", - "tags": "Element,Software System,Actor", - "properties": { - "structurizr.dsl.identifier": "actorb2bsystem" + "name" : "Energi Data Service", + "description" : "Data and services about the Danish energy system such as CO2 emissions and consumption and production data.", + "group" : "Energinet Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "15", + "tags" : "Element,Software System", + "properties" : { + "structurizr.dsl.identifier" : "energyorigin" + }, + "name" : "Energy Origin", + "description" : "Provides a way to issue and claim granular certificates", + "relationships" : [ { + "id" : "38", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "3f28644d-15f8-4a03-8b29-7f585570124e" }, - "name": "Actor B2B System", - "description": "External business transaction system. System-to-system communication (B2B).", - "relationships": [ - { - "id": "70", - "tags": "Relationship", - "sourceId": "2", - "destinationId": "69", - "description": "Requests eg. Peek and Dequeue" - }, - { - "id": "23", - "tags": "Relationship,OAuth", - "sourceId": "2", - "destinationId": "22", - "description": "Request OAuth token", - "technology": "https" - }, - { - "id": "68", - "tags": "Relationship,Simple View", - "sourceId": "2", - "destinationId": "56", - "description": "Requests" - }, - { - "id": "32", - "tags": "Relationship", - "sourceId": "2", - "destinationId": "17", - "description": "Requests calculations", - "technology": "peek+dequeue/https" - }, - { - "id": "24", - "sourceId": "2", - "destinationId": "17", - "description": "Request OAuth token", - "technology": "https", - "linkedRelationshipId": "23" - } - ], - "group": "Electricity Supplier or Grid Company", - "location": "Unspecified", - "documentation": {} + "sourceId" : "15", + "destinationId" : "7", + "description" : "Requests measurements", + "technology" : "https" + }, { + "id" : "39", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "4da215d4-274a-4af5-86e3-18a95cab987f" + }, + "sourceId" : "15", + "destinationId" : "12", + "description" : "Links to guarantees of origin", + "technology" : "https" + }, { + "id" : "40", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "eda56593-92b9-4471-ac3d-119f53b7399d" + }, + "sourceId" : "15", + "destinationId" : "11", + "description" : "Requests emission and residual mix data", + "technology" : "https" + } ], + "group" : "Energinet Organization/DataHub Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "8", + "tags" : "Element,Software System,Out of focus", + "properties" : { + "structurizr.dsl.identifier" : "esett" }, - { - "id": "16", - "tags": "Element,Software System", - "properties": { - "structurizr.dsl.identifier": "dhesett" + "name" : "eSett", + "description" : "Balance settlement system for the Nordic electricity market.", + "group" : "eSett Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "2", + "tags" : "Element,Software System,Actor", + "properties" : { + "structurizr.dsl.identifier" : "actorb2bsystem" + }, + "name" : "Actor B2B System", + "description" : "External business transaction system. System-to-system communication (B2B).", + "relationships" : [ { + "id" : "74", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "af000d4e-d4ca-41d1-a626-b88cc5685a35" }, - "name": "DataHub eSett", - "description": "Converts ebix messages, which contain aggregated energy time series, into a format eSett understands (nbs).", - "relationships": [ - { - "id": "28", - "tags": "Relationship", - "sourceId": "16", - "destinationId": "7", - "description": "Requests ", - "technology": "peek+dequeue/https" - }, - { - "id": "25", - "tags": "Relationship", - "sourceId": "16", - "destinationId": "10", - "description": "Sends calculations", - "technology": "https" - } - ], - "group": "Energinet Organization/DataHub Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "2", + "destinationId" : "73", + "description" : "Requests eg. Peek and Dequeue" + }, { + "id" : "72", + "tags" : "Relationship,Simple View", + "properties" : { + "structurizr.dsl.identifier" : "81b6d523-ba99-4b29-8fa5-db6165162012" + }, + "sourceId" : "2", + "destinationId" : "60", + "description" : "Requests" + }, { + "id" : "25", + "sourceId" : "2", + "destinationId" : "17", + "description" : "Request OAuth token", + "technology" : "https", + "linkedRelationshipId" : "24" + }, { + "id" : "24", + "tags" : "Relationship,OAuth", + "properties" : { + "structurizr.dsl.identifier" : "8b8dc884-0e60-44b1-9f61-35cdb0eecd40" + }, + "sourceId" : "2", + "destinationId" : "23", + "description" : "Request OAuth token", + "technology" : "https" + }, { + "id" : "33", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "09f82a47-7a5e-43cc-ad6c-39e6dfe0d915" + }, + "sourceId" : "2", + "destinationId" : "17", + "description" : "Requests calculations", + "technology" : "peek+dequeue/https" + } ], + "group" : "Electricity Supplier or Grid Company", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "12", + "tags" : "Element,Software System,Out of focus", + "properties" : { + "structurizr.dsl.identifier" : "po" + }, + "name" : "Project Origin", + "description" : "Public permissioned distributed ledger where everyone can validate the Guarantee of Origin for their electricity.", + "group" : "Energinet Organization", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "4", + "tags" : "Element,Software System,Actor", + "properties" : { + "structurizr.dsl.identifier" : "eloverblikthirdpartyuser" }, - { - "id": "10", - "tags": "Element,Software System,Out of focus", - "properties": { - "structurizr.dsl.identifier": "btesett" + "name" : "Eloverblik Third Party", + "description" : "System that interacts with ElOverblik on behalf of a user.", + "relationships" : [ { + "id" : "37", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "311eee80-dd45-4587-a092-874866b9ba6a" }, - "name": "BizTalk eSett", - "description": "Handles communication and network between Energinet and eSett.", - "relationships": [ - { - "id": "26", - "tags": "Relationship", - "sourceId": "10", - "destinationId": "8", - "description": "Sends calculations", - "technology": "" - } - ], - "group": "Energinet Organization", - "location": "Unspecified", - "documentation": {} + "sourceId" : "4", + "destinationId" : "14", + "description" : "Requests ", + "technology" : "https" + } ], + "group" : "Business or private person", + "location" : "Unspecified", + "documentation" : { } + }, { + "id" : "17", + "tags" : "Element,Software System", + "properties" : { + "structurizr.dsl.identifier" : "dh3" }, - { - "id": "17", - "tags": "Element,Software System", - "properties": { - "structurizr.dsl.identifier": "dh3" + "name" : "DataHub 3.0", + "description" : "Provides uniform communication and standardized processes for actors operating on the Danish electricity market.", + "relationships" : [ { + "id" : "22", + "sourceId" : "17", + "destinationId" : "1", + "description" : "Sends mail", + "linkedRelationshipId" : "21" + } ], + "group" : "Energinet Organization/DataHub Organization", + "location" : "Unspecified", + "containers" : [ { + "id" : "49", + "tags" : "Element,Container,Microsoft Azure - Function Apps,Titans", + "properties" : { + "structurizr.dsl.identifier" : "markpartorganizationmanager" }, - "name": "DataHub 3.0", - "description": "Provides uniform communication and standardized processes for actors operating on the Danish electricity market.", - "relationships": [ - { - "id": "21", - "sourceId": "17", - "destinationId": "1", - "description": "Sends mail", - "linkedRelationshipId": "20" - } - ], - "group": "Energinet Organization/DataHub Organization", - "location": "Unspecified", - "containers": [ - { - "id": "97", - "tags": "Element,Container,Intermediate Technology,Microsoft Azure - Static Apps,Mandalorian,Titans,UI/UX Guild", - "properties": { - "structurizr.dsl.identifier": "frontendstaticwebapp" + "name" : "Market Participant ", + "description" : "Synchronizes Azure B2C user and actor state with the domain.", + "relationships" : [ { + "id" : "52", + "sourceId" : "49", + "destinationId" : "23", + "description" : "Creates B2C App Registration", + "technology" : "Microsoft.Graph/https", + "linkedRelationshipId" : "51" + }, { + "id" : "57", + "sourceId" : "49", + "destinationId" : "20", + "description" : "Sends invitation mail", + "technology" : "SendGrid/https", + "linkedRelationshipId" : "56" + }, { + "id" : "54", + "sourceId" : "49", + "destinationId" : "43", + "description" : "Updates actors with external B2C id.", + "technology" : "EF Core", + "linkedRelationshipId" : "53" + } ], + "group" : "Market Participant", + "technology" : "Azure function, C#", + "components" : [ { + "id" : "55", + "tags" : "Element,Component,Microsoft Azure - Function Apps,Titans", + "properties" : { + "structurizr.dsl.identifier" : "markpartmaildispatcher" + }, + "name" : "Mail Dispatcher", + "description" : "Responsible for sending user invitations.", + "relationships" : [ { + "id" : "58", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "e9163c55-50eb-4c69-bc47-7b287ea183da" }, - "name": "Static Web App", - "description": "Delivers the static content and the UI single page application", - "relationships": [ - { - "id": "100", - "tags": "Relationship", - "sourceId": "97", - "destinationId": "91", - "description": "Delivers to users web browser" - } - ], - "group": "Frontend", - "technology": "Static Web App", - "documentation": {} - }, - { - "id": "79", - "tags": "Element,Container,Microsoft Azure - App Services,Mandalorian", - "properties": { - "structurizr.dsl.identifier": "wholesaleapi" + "sourceId" : "55", + "destinationId" : "43", + "description" : "Reads data regarding newly invited users.", + "technology" : "EF Core" + }, { + "id" : "56", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "43362d72-6c7b-4d07-aa03-5dc152c7a078" }, - "name": "Wholesale API", - "description": "Backend server providing external web API for wholesale operations", - "relationships": [ - { - "id": "82", - "tags": "Relationship", - "sourceId": "79", - "destinationId": "76", - "description": "Sends requests to" - }, - { - "id": "84", - "tags": "Relationship,Simple View", - "sourceId": "79", - "destinationId": "56", - "description": "Sends calculations", - "technology": "integration event/amqp" - }, - { - "id": "81", - "tags": "Relationship", - "sourceId": "79", - "destinationId": "78", - "description": "Uses", - "technology": "EF Core" - }, - { - "id": "80", - "tags": "Relationship", - "sourceId": "79", - "destinationId": "18", - "description": "Sends calculations", - "technology": "integration event/amqp" - }, - { - "id": "83", - "tags": "Relationship", - "sourceId": "79", - "destinationId": "75", - "description": "Retrieves results from" - } - ], - "group": "Wholesale", - "technology": "Asp.Net Core Web API", - "documentation": {} - }, - { - "id": "88", - "tags": "Element,Container,Intermediate Technology,Microsoft Azure - API Management Services,Mandalorian,Titans,UI/UX Guild,Outlaws", - "properties": { - "structurizr.dsl.identifier": "bffapi" - }, - "name": "BFF API", - "description": "API Gateway to BFF Web API", - "relationships": [ - { - "id": "90", - "tags": "Relationship,OAuth", - "sourceId": "88", - "destinationId": "22", - "description": "Validate OAuth token", - "technology": "https" - }, - { - "id": "89", - "tags": "Relationship", - "sourceId": "88", - "destinationId": "85", - "description": "Uses", - "technology": "json/https" - } - ], - "group": "Frontend", - "technology": "Azure API Management Service", - "documentation": {} - }, - { - "id": "75", - "tags": "Element,Container,Data Storage,Microsoft Azure - Data Lake Store Gen1,Mandalorian", - "properties": { - "structurizr.dsl.identifier": "wholesaledatalake" - }, - "name": "Data Lake (Wholesale)", - "description": "Stores batch results", - "group": "Wholesale", - "technology": "Azure Data Lake Gen 2", - "documentation": {} - }, - { - "id": "43", - "tags": "Element,Container,Microsoft Azure - App Services,Titans", - "properties": { - "structurizr.dsl.identifier": "markpartapi" - }, - "name": "Market Participant API", - "description": "Multi-tenant API for managing actors, users and permissions.", - "relationships": [ - { - "id": "44", - "tags": "Relationship", - "sourceId": "43", - "destinationId": "42", - "description": "Reads and writes actor/user data.", - "technology": "EF Core" - } - ], - "group": "Market Participant", - "technology": "Asp.Net Core Web API", - "documentation": {} - }, - { - "id": "78", - "tags": "Element,Container,Data Storage,Microsoft Azure - SQL Database,Mandalorian", - "properties": { - "structurizr.dsl.identifier": "wholesaledb" + "sourceId" : "55", + "destinationId" : "20", + "description" : "Sends invitation mail", + "technology" : "SendGrid/https" + } ], + "technology" : "Timer Trigger", + "documentation" : { } + }, { + "id" : "50", + "tags" : "Element,Component,Microsoft Azure - Function Apps,Titans", + "properties" : { + "structurizr.dsl.identifier" : "markparteventactorsynchronizer" + }, + "name" : "Actor Synchronizer", + "description" : "Creates B2C application registration for newly created actors.", + "relationships" : [ { + "id" : "53", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "1a427691-79ab-4d68-a851-7aab3c5019a3" }, - "name": "Wholesale Database", - "description": "Stores batches and operations data", - "group": "Wholesale", - "technology": "SQL Database Schema", - "documentation": {} - }, - { - "id": "69", - "tags": "Element,Container,Intermediate Technology,Microsoft Azure - API Management Services,Phoenix", - "properties": { - "structurizr.dsl.identifier": "ediapi" - }, - "name": "EDI API", - "description": "API Gateway to EDI Web API", - "relationships": [ - { - "id": "73", - "tags": "Relationship", - "sourceId": "69", - "destinationId": "60", - "description": "Dequeue messages" - }, - { - "id": "72", - "sourceId": "69", - "destinationId": "56", - "description": "Requests", - "linkedRelationshipId": "71" - }, - { - "id": "74", - "tags": "Relationship,OAuth", - "sourceId": "69", - "destinationId": "22", - "description": "Validate OAuth token", - "technology": "https" - }, - { - "id": "71", - "tags": "Relationship", - "sourceId": "69", - "destinationId": "57", - "description": "Requests" - } - ], - "group": "EDI", - "technology": "Azure API Management Service", - "documentation": {} - }, - { - "id": "18", - "tags": "Element,Container,Intermediate Technology,PaaS,Microsoft Azure - Azure Service Bus", - "properties": { - "structurizr.dsl.identifier": "dh3.sharedservicebus" - }, - "name": "Message broker", - "description": "Message broker with message queues and publish-subscribe topics", - "technology": "Azure Service Bus", - "documentation": {} - }, - { - "id": "76", - "tags": "Element,Container,Microsoft Azure - Azure Databricks,Mandalorian", - "properties": { - "structurizr.dsl.identifier": "wholesalecalculator" - }, - "name": "Calculation Engine", - "description": "Executes energy calculations", - "relationships": [ - { - "id": "77", - "tags": "Relationship", - "sourceId": "76", - "destinationId": "75", - "description": "Read / write" - } - ], - "group": "Wholesale", - "technology": "Azure Databricks", - "documentation": {} - }, - { - "id": "45", - "tags": "Element,Container,Microsoft Azure - Function Apps,Titans", - "properties": { - "structurizr.dsl.identifier": "markpartorganizationmanager" + "sourceId" : "50", + "destinationId" : "43", + "description" : "Updates actors with external B2C id.", + "technology" : "EF Core" + }, { + "id" : "51", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "75cc7c9c-7c79-4172-951d-614526e54a9d" }, - "name": "Market Participant ", - "description": "", - "relationships": [ - { - "id": "53", - "sourceId": "45", - "destinationId": "19", - "description": "Sends invitation mail", - "technology": "SendGrid/https", - "linkedRelationshipId": "52" - }, - { - "id": "50", - "sourceId": "45", - "destinationId": "42", - "description": "Updates actors with external B2C id.", - "technology": "EF Core", - "linkedRelationshipId": "49" - }, - { - "id": "48", - "sourceId": "45", - "destinationId": "22", - "description": "Creates B2C App Registration", - "technology": "Microsoft.Graph/https", - "linkedRelationshipId": "47" - } - ], - "group": "Market Participant", - "technology": "Azure function, C#", - "components": [ - { - "id": "46", - "tags": "Element,Component,Microsoft Azure - Function Apps,Titans", - "properties": { - "structurizr.dsl.identifier": "markparteventactorsynchronizer" - }, - "name": "Actor Synchronizer", - "description": "Creates B2C application registration for newly created actors.", - "relationships": [ - { - "id": "47", - "tags": "Relationship", - "sourceId": "46", - "destinationId": "22", - "description": "Creates B2C App Registration", - "technology": "Microsoft.Graph/https" - }, - { - "id": "49", - "tags": "Relationship", - "sourceId": "46", - "destinationId": "42", - "description": "Updates actors with external B2C id.", - "technology": "EF Core" - } - ], - "technology": "Timer Trigger", - "documentation": {} - }, - { - "id": "51", - "tags": "Element,Component,Microsoft Azure - Function Apps,Titans", - "properties": { - "structurizr.dsl.identifier": "markpartmaildispatcher" - }, - "name": "Mail Dispatcher", - "description": "Responsible for sending user invitations.", - "relationships": [ - { - "id": "54", - "tags": "Relationship", - "sourceId": "51", - "destinationId": "42", - "description": "Reads data regarding newly invited users.", - "technology": "EF Core" - }, - { - "id": "52", - "tags": "Relationship", - "sourceId": "51", - "destinationId": "19", - "description": "Sends invitation mail", - "technology": "SendGrid/https" - } - ], - "technology": "Timer Trigger", - "documentation": {} - } - ], - "documentation": {} - }, - { - "id": "56", - "tags": "Element,Container,Microsoft Azure - Function Apps,Phoenix", - "properties": { - "structurizr.dsl.identifier": "edi" - }, - "name": "EDI", - "description": "Backend server providing API for EDI operations", - "relationships": [ - { - "id": "66", - "sourceId": "56", - "destinationId": "18", - "description": "Subscribes to integration events", - "linkedRelationshipId": "65" - }, - { - "id": "59", - "sourceId": "56", - "destinationId": "55", - "description": "Stores messages and business transactions", - "technology": "EF Core, Dapper", - "linkedRelationshipId": "58" - } - ], - "group": "EDI", - "technology": "Azure function, C#", - "components": [ - { - "id": "60", - "tags": "Element,Component,Microsoft Azure - Function Apps,Phoenix", - "properties": { - "structurizr.dsl.identifier": "edidequeuecomponent" - }, - "name": "Dequeue component", - "description": "Handles dequeue requests from actors", - "relationships": [ - { - "id": "61", - "tags": "Relationship", - "sourceId": "60", - "destinationId": "55", - "description": "Deletes messages that have been peeked", - "technology": "EF Core" - } - ], - "technology": "Http Trigger", - "documentation": {} - }, - { - "id": "62", - "tags": "Element,Component,Microsoft Azure - Function Apps,Phoenix", - "properties": { - "structurizr.dsl.identifier": "editimeseriesrequester" - }, - "name": "TimeSeries request component", - "description": "Fetches time series data from relevant domain", - "relationships": [ - { - "id": "63", - "tags": "Relationship", - "sourceId": "62", - "destinationId": "55", - "description": "Writes time series data to database", - "technology": "EF Core" - } - ], - "technology": " Trigger", - "documentation": {} - }, - { - "id": "57", - "tags": "Element,Component,Microsoft Azure - Function Apps,Phoenix", - "properties": { - "structurizr.dsl.identifier": "edipeekcomponent" - }, - "name": "Peek component", - "description": "Handles peek requests from actors", - "relationships": [ - { - "id": "58", - "tags": "Relationship", - "sourceId": "57", - "destinationId": "55", - "description": "Stores messages and business transactions", - "technology": "EF Core, Dapper" - } - ], - "technology": "Http Trigger", - "documentation": {} - }, - { - "id": "64", - "tags": "Element,Component,Microsoft Azure - Function Apps,Phoenix", - "properties": { - "structurizr.dsl.identifier": "editimeserieslistener" - }, - "name": "TimeSeries listener", - "description": "Listens for integration events indicating time series data is ready", - "relationships": [ - { - "id": "67", - "tags": "Relationship", - "sourceId": "64", - "destinationId": "62", - "description": "Triggers requester to fetch time series data" - }, - { - "id": "65", - "tags": "Relationship", - "sourceId": "64", - "destinationId": "18", - "description": "Subscribes to integration events" - } - ], - "technology": "Service Bus Trigger", - "documentation": {} - } - ], - "documentation": {} - }, - { - "id": "85", - "tags": "Element,Container,Microsoft Azure - App Services,Mandalorian,Titans,UI/UX Guild", - "properties": { - "structurizr.dsl.identifier": "bffapp" - }, - "name": "BFF Web API", - "description": "Backend for frontend (BFF) combines data for presentation on DataHub 3 UI", - "relationships": [ - { - "id": "87", - "tags": "Relationship", - "sourceId": "85", - "destinationId": "43", - "description": "Uses", - "technology": "json/https" - }, - { - "id": "86", - "tags": "Relationship", - "sourceId": "85", - "destinationId": "79", - "description": "Uses", - "technology": "json/https" - } - ], - "group": "Frontend", - "technology": "Asp.Net Core Web API", - "documentation": {} - }, - { - "id": "19", - "tags": "Element,Container,Intermediate Technology,SaaS,Microsoft Azure - SendGrid Accounts", - "properties": { - "structurizr.dsl.identifier": "dh3.sharedsendgrid" + "sourceId" : "50", + "destinationId" : "23", + "description" : "Creates B2C App Registration", + "technology" : "Microsoft.Graph/https" + } ], + "technology" : "Timer Trigger", + "documentation" : { } + } ], + "documentation" : { } + }, { + "id" : "83", + "tags" : "Element,Container,Microsoft Azure - App Services,Mandalorian", + "properties" : { + "structurizr.dsl.identifier" : "wholesaleapi" + }, + "name" : "Wholesale API", + "description" : "Backend server providing external web API for wholesale operations", + "relationships" : [ { + "id" : "88", + "tags" : "Relationship,Simple View", + "properties" : { + "structurizr.dsl.identifier" : "73f2a296-187b-460f-aed8-3326d89bf906" + }, + "sourceId" : "83", + "destinationId" : "60", + "description" : "Sends calculations", + "technology" : "integration event/amqp" + }, { + "id" : "87", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "3bc663f4-df12-43de-b5b7-237bc87c3ae7" + }, + "sourceId" : "83", + "destinationId" : "79", + "description" : "Retrieves results from" + }, { + "id" : "84", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "6436fcca-887d-4149-8b83-b71d6768e254" + }, + "sourceId" : "83", + "destinationId" : "19", + "description" : "Sends calculations", + "technology" : "integration event/amqp" + }, { + "id" : "86", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "74d77e6a-3948-47e9-8ccb-f2ea3f2c4f7c" + }, + "sourceId" : "83", + "destinationId" : "80", + "description" : "Sends requests to" + }, { + "id" : "85", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "b5222b2f-59ae-49a6-ad5e-dced8397f366" + }, + "sourceId" : "83", + "destinationId" : "82", + "description" : "Uses", + "technology" : "EF Core" + } ], + "group" : "Wholesale", + "technology" : "Asp.Net Core Web API", + "documentation" : { } + }, { + "id" : "19", + "tags" : "Element,Container,Intermediate Technology,PaaS,Microsoft Azure - Azure Service Bus", + "properties" : { + "structurizr.dsl.identifier" : "dh3.sharedservicebus" + }, + "name" : "Message broker", + "description" : "Message broker with message queues and publish-subscribe topics", + "technology" : "Azure Service Bus", + "documentation" : { } + }, { + "id" : "89", + "tags" : "Element,Container,Microsoft Azure - App Services,Titans", + "properties" : { + "structurizr.dsl.identifier" : "esettapi" + }, + "name" : "eSett Exchange WebAPI", + "description" : "eSett exchange API", + "group" : "eSett Exchange", + "technology" : "Asp.Net Core Web API", + "documentation" : { } + }, { + "id" : "60", + "tags" : "Element,Container,Microsoft Azure - Function Apps,Mosaic", + "properties" : { + "structurizr.dsl.identifier" : "edi" + }, + "name" : "EDI", + "description" : "Backend server providing API for EDI operations", + "relationships" : [ { + "id" : "63", + "sourceId" : "60", + "destinationId" : "59", + "description" : "Stores messages and business transactions", + "technology" : "EF Core, Dapper", + "linkedRelationshipId" : "62" + }, { + "id" : "70", + "sourceId" : "60", + "destinationId" : "19", + "description" : "Subscribes to integration events", + "linkedRelationshipId" : "69" + } ], + "group" : "EDI", + "technology" : "Azure function, C#", + "components" : [ { + "id" : "64", + "tags" : "Element,Component,Microsoft Azure - Function Apps,Mosaic", + "properties" : { + "structurizr.dsl.identifier" : "edidequeuecomponent" + }, + "name" : "Dequeue component", + "description" : "Handles dequeue requests from actors", + "relationships" : [ { + "id" : "65", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "f0b10c0a-0a53-4826-93d2-249fb413ab0a" }, - "name": "SendGrid (shared)", - "description": "EMail dispatcher", - "relationships": [ - { - "id": "20", - "tags": "Relationship", - "sourceId": "19", - "destinationId": "1", - "description": "Sends mail" - } - ], - "technology": "Twilio SendGrid", - "documentation": {} - }, - { - "id": "42", - "tags": "Element,Container,Data Storage,Microsoft Azure - SQL Database,Titans", - "properties": { - "structurizr.dsl.identifier": "markpartdb" + "sourceId" : "64", + "destinationId" : "59", + "description" : "Deletes messages that have been peeked", + "technology" : "EF Core" + } ], + "technology" : "Http Trigger", + "documentation" : { } + }, { + "id" : "61", + "tags" : "Element,Component,Microsoft Azure - Function Apps,Mosaic", + "properties" : { + "structurizr.dsl.identifier" : "edipeekcomponent" + }, + "name" : "Peek component", + "description" : "Handles peek requests from actors", + "relationships" : [ { + "id" : "62", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "e34e6578-4510-478c-a9b7-e4df0564d76a" }, - "name": "Actors Database", - "description": "Stores data regarding actors, users and permissions.", - "group": "Market Participant", - "technology": "SQL Database Schema", - "documentation": {} - }, - { - "id": "91", - "tags": "Element,Container,Web Browser,Mandalorian,Titans,UI/UX Guild", - "properties": { - "structurizr.dsl.identifier": "frontendsinglepageapplication" + "sourceId" : "61", + "destinationId" : "59", + "description" : "Stores messages and business transactions", + "technology" : "EF Core, Dapper" + } ], + "technology" : "Http Trigger", + "documentation" : { } + }, { + "id" : "66", + "tags" : "Element,Component,Microsoft Azure - Function Apps,Mosaic", + "properties" : { + "structurizr.dsl.identifier" : "editimeseriesrequester" + }, + "name" : "TimeSeries request component", + "description" : "Fetches time series data from relevant domain", + "relationships" : [ { + "id" : "67", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "9f49127b-3379-407b-b659-514de3cd4a15" }, - "name": "UI", - "description": "Provides DH3 functionality to users via their web browser.", - "relationships": [ - { - "id": "96", - "tags": "Relationship,OAuth", - "sourceId": "91", - "destinationId": "22", - "description": "Request OAuth token", - "technology": "https" - }, - { - "id": "94", - "tags": "Relationship", - "sourceId": "91", - "destinationId": "88", - "description": "Uses GraphQL and RESTful services", - "technology": "json/https" - }, - { - "id": "95", - "tags": "Relationship,Simple View", - "sourceId": "91", - "destinationId": "85", - "description": "Uses", - "technology": "json/https" - } - ], - "group": "Frontend", - "technology": "Angular", - "documentation": {} - }, - { - "id": "22", - "tags": "Element,Container,Microsoft Azure - Azure AD B2C", - "properties": { - "structurizr.dsl.identifier": "dh3.sharedb2c" + "sourceId" : "66", + "destinationId" : "59", + "description" : "Writes time series data to database", + "technology" : "EF Core" + } ], + "technology" : " Trigger", + "documentation" : { } + }, { + "id" : "68", + "tags" : "Element,Component,Microsoft Azure - Function Apps,Mosaic", + "properties" : { + "structurizr.dsl.identifier" : "editimeserieslistener" + }, + "name" : "TimeSeries listener", + "description" : "Listens for integration events indicating time series data is ready", + "relationships" : [ { + "id" : "69", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "a8f26790-8c6a-4920-9d26-639c36ed9160" }, - "name": "App Registrations (shared)", - "description": "Cloud identity directory", - "technology": "Azure AD B2C", - "documentation": {} - }, - { - "id": "55", - "tags": "Element,Container,Data Storage,Microsoft Azure - SQL Database,Phoenix", - "properties": { - "structurizr.dsl.identifier": "edidb" + "sourceId" : "68", + "destinationId" : "19", + "description" : "Subscribes to integration events" + }, { + "id" : "71", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "1cc576e1-34b5-4851-8f6b-e1bf77d61b73" }, - "name": "EDI Database", - "description": "Stores information related to EDI operations", - "group": "EDI", - "technology": "SQL Server", - "documentation": {} - } - ], - "documentation": {} - }, - { - "id": "4", - "tags": "Element,Software System,Actor", - "properties": { - "structurizr.dsl.identifier": "eloverblikthirdpartyuser" + "sourceId" : "68", + "destinationId" : "66", + "description" : "Triggers requester to fetch time series data" + } ], + "technology" : "Service Bus Trigger", + "documentation" : { } + } ], + "documentation" : { } + }, { + "id" : "45", + "tags" : "Element,Container,Microsoft Azure - App Services,Titans", + "properties" : { + "structurizr.dsl.identifier" : "markpartapi" + }, + "name" : "Market Participant API", + "description" : "Multi-tenant API for managing actors, users and permissions.", + "relationships" : [ { + "id" : "46", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "c7675b3d-46b1-4c8e-9588-67b069ee0ba8" + }, + "sourceId" : "45", + "destinationId" : "23", + "description" : "Creates and manages B2C users", + "technology" : "Microsoft.Graph/https" + }, { + "id" : "47", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "07a8faf2-1a74-46f1-8f67-11ea86df5131" + }, + "sourceId" : "45", + "destinationId" : "43", + "description" : "Reads and writes actor/user data.", + "technology" : "EF Core" + }, { + "id" : "48", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "1ae82dfb-d97e-46c3-99ba-aec1c828e172" + }, + "sourceId" : "45", + "destinationId" : "44", + "description" : "Signs, and reads public key for, tokens.", + "technology" : "Microsoft.Graph/https" + } ], + "group" : "Market Participant", + "technology" : "Asp.Net Core Web API", + "documentation" : { } + }, { + "id" : "82", + "tags" : "Element,Container,Data Storage,Microsoft Azure - SQL Database,Mandalorian", + "properties" : { + "structurizr.dsl.identifier" : "wholesaledb" + }, + "name" : "Wholesale Database", + "description" : "Stores batches and operations data", + "group" : "Wholesale", + "technology" : "SQL Database Schema", + "documentation" : { } + }, { + "id" : "79", + "tags" : "Element,Container,Data Storage,Microsoft Azure - Data Lake Store Gen1,Mandalorian", + "properties" : { + "structurizr.dsl.identifier" : "wholesaledatalake" + }, + "name" : "Data Lake (Wholesale)", + "description" : "Stores batch results", + "group" : "Wholesale", + "technology" : "Azure Data Lake Gen 2", + "documentation" : { } + }, { + "id" : "43", + "tags" : "Element,Container,Data Storage,Microsoft Azure - SQL Database,Titans", + "properties" : { + "structurizr.dsl.identifier" : "markpartdb" + }, + "name" : "Actors Database", + "description" : "Stores data regarding actors, users and permissions.", + "group" : "Market Participant", + "technology" : "SQL Database Schema", + "documentation" : { } + }, { + "id" : "20", + "tags" : "Element,Container,Intermediate Technology,SaaS,Microsoft Azure - SendGrid Accounts", + "properties" : { + "structurizr.dsl.identifier" : "dh3.sharedsendgrid" + }, + "name" : "SendGrid (shared)", + "description" : "EMail dispatcher", + "relationships" : [ { + "id" : "21", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "08b16f64-c5a9-4f64-93e6-64d760a8bd8c" + }, + "sourceId" : "20", + "destinationId" : "1", + "description" : "Sends mail" + } ], + "technology" : "Twilio SendGrid", + "documentation" : { } + }, { + "id" : "103", + "tags" : "Element,Container,Intermediate Technology,Microsoft Azure - Static Apps,Mandalorian,Titans,UI/UX Guild", + "properties" : { + "structurizr.dsl.identifier" : "frontendstaticwebapp" + }, + "name" : "Static Web App", + "description" : "Delivers the static content and the UI single page application", + "relationships" : [ { + "id" : "106", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "d4913cd4-0ec7-40d9-b063-2c5f238432f3" + }, + "sourceId" : "103", + "destinationId" : "97", + "description" : "Delivers to users web browser" + } ], + "group" : "Frontend", + "technology" : "Static Web App", + "documentation" : { } + }, { + "id" : "44", + "tags" : "Element,Container,Microsoft Azure - Key Vaults,Titans", + "properties" : { + "structurizr.dsl.identifier" : "markpartkeyvault" + }, + "name" : "Market Participant Internal Key Vault", + "description" : "Stores key used for signing tokens.", + "group" : "Market Participant", + "technology" : "Azure Key Vault", + "documentation" : { } + }, { + "id" : "18", + "tags" : "Element,Container,Microsoft Azure - Key Vaults", + "properties" : { + "structurizr.dsl.identifier" : "dh3.sharedkeyvault" + }, + "name" : "Key Vault", + "description" : "Store for secrets and signing keys", + "technology" : "Azure Key Vault", + "documentation" : { } + }, { + "id" : "90", + "tags" : "Element,Container,Microsoft Azure - App Services,Mandalorian,Titans,UI/UX Guild", + "properties" : { + "structurizr.dsl.identifier" : "bffapp" + }, + "name" : "BFF Web API", + "description" : "Backend for frontend (BFF) combines data for presentation on DataHub 3 UI", + "relationships" : [ { + "id" : "91", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "1430deaa-e8cc-414b-8e1d-3c79fc337742" + }, + "sourceId" : "90", + "destinationId" : "83", + "description" : "Uses", + "technology" : "json/https" + }, { + "id" : "92", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "2f8dfe19-a8b8-4caf-bc66-9068a04e57a9" + }, + "sourceId" : "90", + "destinationId" : "45", + "description" : "Uses", + "technology" : "json/https" + }, { + "id" : "93", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "c3f7b9cb-0c08-4bb3-b1aa-5a74a35520ec" + }, + "sourceId" : "90", + "destinationId" : "89", + "description" : "Uses", + "technology" : "json/https" + } ], + "group" : "Frontend", + "technology" : "Asp.Net Core Web API", + "documentation" : { } + }, { + "id" : "59", + "tags" : "Element,Container,Data Storage,Microsoft Azure - SQL Database,Mosaic", + "properties" : { + "structurizr.dsl.identifier" : "edidb" + }, + "name" : "EDI Database", + "description" : "Stores information related to EDI operations", + "group" : "EDI", + "technology" : "SQL Server", + "documentation" : { } + }, { + "id" : "23", + "tags" : "Element,Container,Microsoft Azure - Azure AD B2C", + "properties" : { + "structurizr.dsl.identifier" : "dh3.sharedb2c" + }, + "name" : "App Registrations (shared)", + "description" : "Cloud identity directory", + "technology" : "Azure AD B2C", + "documentation" : { } + }, { + "id" : "97", + "tags" : "Element,Container,Web Browser,Mandalorian,Titans,UI/UX Guild", + "properties" : { + "structurizr.dsl.identifier" : "frontendsinglepageapplication" + }, + "name" : "UI", + "description" : "Provides DH3 functionality to users via their web browser.", + "relationships" : [ { + "id" : "101", + "tags" : "Relationship,Simple View", + "properties" : { + "structurizr.dsl.identifier" : "716f3fb8-9d44-4b5f-979f-0b2efb247bab" + }, + "sourceId" : "97", + "destinationId" : "90", + "description" : "Uses", + "technology" : "json/https" + }, { + "id" : "100", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "04122813-ac4a-475f-8f42-2190d8cea82d" + }, + "sourceId" : "97", + "destinationId" : "94", + "description" : "Uses GraphQL and RESTful services", + "technology" : "json/https" + }, { + "id" : "102", + "tags" : "Relationship,OAuth", + "properties" : { + "structurizr.dsl.identifier" : "31546d9c-f9e2-4bdb-982f-76b24e22f6bc" + }, + "sourceId" : "97", + "destinationId" : "23", + "description" : "Request OAuth token", + "technology" : "https" + } ], + "group" : "Frontend", + "technology" : "Angular", + "documentation" : { } + }, { + "id" : "94", + "tags" : "Element,Container,Intermediate Technology,Microsoft Azure - API Management Services,Mandalorian,Titans,UI/UX Guild,Outlaws", + "properties" : { + "structurizr.dsl.identifier" : "bffapi" + }, + "name" : "BFF API", + "description" : "API Gateway to BFF Web API", + "relationships" : [ { + "id" : "96", + "tags" : "Relationship,OAuth", + "properties" : { + "structurizr.dsl.identifier" : "d6da4cfa-314a-48ea-a594-b2cf9b1e9583" + }, + "sourceId" : "94", + "destinationId" : "23", + "description" : "Validate OAuth token", + "technology" : "https" + }, { + "id" : "95", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "b9d5221c-35bc-4e03-b37b-2c17af635857" + }, + "sourceId" : "94", + "destinationId" : "90", + "description" : "Uses", + "technology" : "json/https" + } ], + "group" : "Frontend", + "technology" : "Azure API Management Service", + "documentation" : { } + }, { + "id" : "80", + "tags" : "Element,Container,Microsoft Azure - Azure Databricks,Mandalorian", + "properties" : { + "structurizr.dsl.identifier" : "wholesalecalculator" }, - "name": "Eloverblik Third Party", - "description": "System that interacts with ElOverblik on behalf of a user.", - "relationships": [ - { - "id": "36", - "tags": "Relationship", - "sourceId": "4", - "destinationId": "14", - "description": "Requests ", - "technology": "https" - } - ], - "group": "Business or private person", - "location": "Unspecified", - "documentation": {} + "name" : "Calculation Engine", + "description" : "Executes energy calculations", + "relationships" : [ { + "id" : "81", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "355c1a88-bd67-42e8-9a0c-3a524f4ca7f9" + }, + "sourceId" : "80", + "destinationId" : "79", + "description" : "Read / write" + } ], + "group" : "Wholesale", + "technology" : "Azure Databricks", + "documentation" : { } + }, { + "id" : "73", + "tags" : "Element,Container,Intermediate Technology,Microsoft Azure - API Management Services,Mosaic", + "properties" : { + "structurizr.dsl.identifier" : "ediapi" + }, + "name" : "EDI API", + "description" : "API Gateway policies for EDI Web API", + "relationships" : [ { + "id" : "77", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "50c3f95c-7610-4096-a255-222667316d35" + }, + "sourceId" : "73", + "destinationId" : "64", + "description" : "Dequeue messages" + }, { + "id" : "76", + "sourceId" : "73", + "destinationId" : "60", + "description" : "Requests", + "linkedRelationshipId" : "75" + }, { + "id" : "75", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "e41002b9-0716-403a-a83d-915b5a4ee962" + }, + "sourceId" : "73", + "destinationId" : "61", + "description" : "Requests" + }, { + "id" : "78", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "c5218e22-9dbb-4f75-bcf1-b9fbc39af523" + }, + "sourceId" : "73", + "destinationId" : "23", + "description" : "Validate credentials", + "technology" : "https" + } ], + "group" : "EDI", + "technology" : "Azure API Management Service", + "documentation" : { } + } ], + "documentation" : { } + }, { + "id" : "7", + "tags" : "Element,Software System,Out of focus", + "properties" : { + "structurizr.dsl.identifier" : "dh2" }, - { - "id": "15", - "tags": "Element,Software System", - "properties": { - "structurizr.dsl.identifier": "energyorigin" + "name" : "DataHub 2.0", + "description" : "Existing DataHub system. Provides uniform communication and standardized processes for actors operating on the Danish electricity market.", + "relationships" : [ { + "id" : "34", + "tags" : "Relationship", + "properties" : { + "structurizr.dsl.identifier" : "db9a5d71-0cde-492e-9dff-90050c298917" }, - "name": "Energy Origin", - "description": "Provides a way to issue and claim granular certificates", - "relationships": [ - { - "id": "38", - "tags": "Relationship", - "sourceId": "15", - "destinationId": "12", - "description": "Links to guarantees of origin", - "technology": "https" - }, - { - "id": "37", - "tags": "Relationship", - "sourceId": "15", - "destinationId": "7", - "description": "Requests measurements", - "technology": "https" - }, - { - "id": "39", - "tags": "Relationship", - "sourceId": "15", - "destinationId": "11", - "description": "Requests emission and residual mix data", - "technology": "https" - } - ], - "group": "Energinet Organization/DataHub Organization", - "location": "Unspecified", - "documentation": {} - } - ], - "properties": { - "structurizr.groupSeparator": "/" + "sourceId" : "7", + "destinationId" : "17", + "description" : "Transfers ", + "technology" : "AzCopy/https" + } ], + "group" : "CGI Organization", + "location" : "Unspecified", + "documentation" : { } + } ], + "properties" : { + "structurizr.groupSeparator" : "/" } }, - "documentation": {}, - "views": { - "containerViews": [ - { - "key": "Frontend", - "order": 1, - "title": "[Container] DataHub 3.0 - Frontend (Simplified)", - "softwareSystemId": "17", - "paperSize": "A4_Portrait", - "dimensions": { - "width": 2079, - "height": 2825 - }, - "externalSoftwareSystemBoundariesVisible": true, - "elements": [ - { - "id": "1", - "x": 487, - "y": 208 - }, - { - "id": "13", - "x": 1187, - "y": 208 - }, - { - "id": "79", - "x": 1195, - "y": 2108 - }, - { - "id": "91", - "x": 812, - "y": 908 - }, - { - "id": "85", - "x": 812, - "y": 1508 - }, - { - "id": "43", - "x": 433, - "y": 2108 - } - ], - "relationships": [ - { - "id": "93" - }, - { - "id": "92" - }, - { - "id": "86" - }, - { - "id": "87" - }, - { - "id": "95" - } - ] + "documentation" : { }, + "views" : { + "containerViews" : [ { + "key" : "FrontendDetailed", + "order" : 2, + "title" : "[Container] DataHub 3.0 - Frontend (Detailed with OAuth)", + "softwareSystemId" : "17", + "dimensions" : { + "width" : 2964, + "height" : 4491 }, - { - "key": "FrontendDetailed", - "order": 2, - "title": "[Container] DataHub 3.0 - Frontend (Detailed with OAuth)", - "softwareSystemId": "17", - "dimensions": { - "width": 2220, - "height": 3164 - }, - "externalSoftwareSystemBoundariesVisible": true, - "elements": [ - { - "id": "22", - "x": 1544, - "y": 1609 - }, - { - "id": "88", - "x": 872, - "y": 1898 - }, - { - "id": "1", - "x": 249, - "y": 199 - }, - { - "id": "13", - "x": 1469, - "y": 209 - }, - { - "id": "79", - "x": 1529, - "y": 2494 - }, - { - "id": "91", - "x": 872, - "y": 1298 - }, - { - "id": "85", - "x": 872, - "y": 2498 - }, - { - "id": "97", - "x": 872, - "y": 698 - }, - { - "id": "43", - "x": 239, - "y": 2489 - } - ], - "relationships": [ - { - "id": "93", - "vertices": [ - { - "x": 1472, - "y": 998 - } - ] - }, - { - "id": "94" - }, - { - "id": "92", - "vertices": [ - { - "x": 722, - "y": 998 - } - ] - }, - { - "id": "86" - }, - { - "id": "98" - }, - { - "id": "87" - }, - { - "id": "96" - }, - { - "id": "100" - }, - { - "id": "99" - }, - { - "id": "89" - }, - { - "id": "90" - } - ] - } - ], - "configuration": { - "branding": {}, - "styles": { - "elements": [ - { - "tag": "Not Compliant", - "background": "#ffbb55", - "color": "#ffffff" - }, - { - "tag": "Intermediate Technology", - "background": "#dddddd", - "color": "#999999" - }, - { - "tag": "Out of focus", - "background": "#999999", - "color": "#ffffff" - }, - { - "tag": "Infrastructure Node", - "background": "#dddddd" - }, - { - "tag": "Data Storage", - "shape": "Cylinder" - }, - { - "tag": "Group:Energinet Organization/DataHub Organization", - "color": "#0000ff" - }, - { - "tag": "Person", - "background": "#08427b", - "color": "#ffffff", - "shape": "Person" - }, - { - "tag": "Web Browser", - "shape": "WebBrowser" - }, - { - "tag": "Actor", - "background": "#08427b", - "color": "#ffffff", - "shape": "RoundedBox" - } - ] + "externalSoftwareSystemBoundariesVisible" : true, + "elements" : [ { + "id" : "23", + "x" : 2294, + "y" : 3899 + }, { + "id" : "1", + "x" : 1440, + "y" : 199 + }, { + "id" : "45", + "x" : 240, + "y" : 3299 + }, { + "id" : "89", + "x" : 1765, + "y" : 3299 + }, { + "id" : "13", + "x" : 2302, + "y" : 199 + }, { + "id" : "103", + "x" : 1765, + "y" : 899 + }, { + "id" : "90", + "x" : 1765, + "y" : 2699 + }, { + "id" : "94", + "x" : 1765, + "y" : 2099 + }, { + "id" : "83", + "x" : 1002, + "y" : 3299 + }, { + "id" : "97", + "x" : 1765, + "y" : 1499 + } ], + "relationships" : [ { + "id" : "93" + }, { + "id" : "91" + }, { + "id" : "92", + "vertices" : [ { + "x" : 823, + "y" : 3195 + } ] + }, { + "id" : "98", + "vertices" : [ { + "x" : 1615, + "y" : 691 + }, { + "x" : 1615, + "y" : 1199 + } ] + }, { + "id" : "95" + }, { + "id" : "96", + "vertices" : [ { + "x" : 2365, + "y" : 2699 + } ] + }, { + "id" : "100" + }, { + "id" : "102", + "vertices" : [ { + "x" : 2365, + "y" : 2099 + }, { + "x" : 2465, + "y" : 2699 + }, { + "x" : 2527, + "y" : 3195 + }, { + "x" : 2527, + "y" : 3703 + } ] + }, { + "id" : "99", + "vertices" : [ { + "x" : 2365, + "y" : 1199 + } ] + }, { + "id" : "46", + "vertices" : [ { + "x" : 823, + "y" : 3703 + } ] + }, { + "id" : "104" + }, { + "id" : "106" + }, { + "id" : "105" + } ] + }, { + "key" : "Frontend", + "order" : 1, + "title" : "[Container] DataHub 3.0 - Frontend (Simplified)", + "softwareSystemId" : "17", + "dimensions" : { + "width" : 2455, + "height" : 2765 + }, + "externalSoftwareSystemBoundariesVisible" : true, + "elements" : [ { + "id" : "1", + "x" : 676, + "y" : 199 + }, { + "id" : "45", + "x" : 239, + "y" : 2099 + }, { + "id" : "89", + "x" : 1764, + "y" : 2099 + }, { + "id" : "13", + "x" : 1376, + "y" : 199 + }, { + "id" : "90", + "x" : 1001, + "y" : 1499 + }, { + "id" : "83", + "x" : 1001, + "y" : 2099 + }, { + "id" : "97", + "x" : 1001, + "y" : 899 + } ], + "relationships" : [ { + "id" : "93" + }, { + "id" : "91" + }, { + "id" : "92" + }, { + "id" : "98" + }, { + "id" : "99" + }, { + "id" : "101" + } ] + } ], + "configuration" : { + "branding" : { }, + "styles" : { + "elements" : [ { + "tag" : "Not Compliant", + "background" : "#ffbb55", + "color" : "#ffffff" + }, { + "tag" : "Intermediate Technology", + "background" : "#dddddd", + "color" : "#999999" + }, { + "tag" : "Out of focus", + "background" : "#999999", + "color" : "#ffffff" + }, { + "tag" : "Infrastructure Node", + "background" : "#dddddd" + }, { + "tag" : "Data Storage", + "shape" : "Cylinder" + }, { + "tag" : "Group:Energinet Organization/DataHub Organization", + "color" : "#0000ff" + }, { + "tag" : "Person", + "background" : "#08427b", + "color" : "#ffffff", + "shape" : "Person" + }, { + "tag" : "Web Browser", + "shape" : "WebBrowser" + }, { + "tag" : "Actor", + "background" : "#08427b", + "color" : "#ffffff", + "shape" : "RoundedBox" + } ] }, - "themes": [ - "https://static.structurizr.com/themes/default/theme.json", - "https://static.structurizr.com/themes/microsoft-azure-2023.01.24/icons.json" - ], - "terminology": {}, - "metadataSymbols": "SquareBrackets", - "lastSavedView": "Frontend" + "themes" : [ "https://static.structurizr.com/themes/default/theme.json", "https://static.structurizr.com/themes/microsoft-azure-2023.01.24/icons.json" ], + "terminology" : { }, + "metadataSymbols" : "SquareBrackets", + "lastSavedView" : "FrontendDetailed" } } -} +} \ No newline at end of file