Repository: Azure/ARO-RP
Pull request #1174 (2020-11-17 23:13:20)

More RP startup refactoring
This set of commits removes autodiscovery of database, key vaults and DNS as these have occasionally given us startup problems in production.

In addition they begin to separate out use of the service key vault, making it easier for additional services *not* to use it.

There are a few cleanups as well.

jim-minter: have (hopefully) updated CI secrets to correspond with this PR
jim-minter: /azp run e2e
azure-pipelines[bot]: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
github-actions[bot]: Please rebase pull request.

Patch:
diff --git a/cmd/aro/monitor.go b/cmd/aro/monitor.go
index 5e887d7eb..bba6d97b5 100644
--- a/cmd/aro/monitor.go
+++ b/cmd/aro/monitor.go
@@ -13,6 +13,7 @@ import (
 	"k8s.io/client-go/tools/metrics"
 
 	"github.com/Azure/ARO-RP/pkg/database"
+	"github.com/Azure/ARO-RP/pkg/deploy/generator"
 	"github.com/Azure/ARO-RP/pkg/env"
 	"github.com/Azure/ARO-RP/pkg/metrics/noop"
 	"github.com/Azure/ARO-RP/pkg/metrics/statsd"
@@ -22,6 +23,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/proxy"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	"github.com/Azure/ARO-RP/pkg/util/encryption"
+	"github.com/Azure/ARO-RP/pkg/util/keyvault"
 )
 
 func monitor(ctx context.Context, log *logrus.Entry) error {
@@ -59,7 +61,25 @@ func monitor(ctx context.Context, log *logrus.Entry) error {
 		return err
 	}
 
-	cipher, err := encryption.NewXChaCha20Poly1305(ctx, _env, env.EncryptionSecretName)
+	rpKVAuthorizer, err := _env.NewRPAuthorizer(_env.Environment().ResourceIdentifiers.KeyVault)
+	if err != nil {
+		return err
+	}
+
+	// TODO: should not be using the service keyvault here
+	serviceKeyvaultURI, err := keyvault.URI(_env, generator.ServiceKeyvaultSuffix)
+	if err != nil {
+		return err
+	}
+
+	serviceKeyvault := keyvault.NewManager(rpKVAuthorizer, serviceKeyvaultURI)
+
+	key, err := serviceKeyvault.GetBase64Secret(ctx, env.EncryptionSecretName)
+	if err != nil {
+		return err
+	}
+
+	cipher, err := encryption.NewXChaCha20Poly1305(ctx, key)
 	if err != nil {
 		return err
 	}
diff --git a/cmd/aro/rp.go b/cmd/aro/rp.go
index fb4cdf097..81784afd1 100644
--- a/cmd/aro/rp.go
+++ b/cmd/aro/rp.go
@@ -76,7 +76,12 @@ func rp(ctx context.Context, log *logrus.Entry) error {
 		RequestLatency: k8s.NewLatency(m),
 	})
 
-	cipher, err := encryption.NewXChaCha20Poly1305(ctx, _env, env.EncryptionSecretName)
+	dbKey, err := _env.ServiceKeyvault().GetBase64Secret(ctx, env.EncryptionSecretName)
+	if err != nil {
+		return err
+	}
+
+	cipher, err := encryption.NewXChaCha20Poly1305(ctx, dbKey)
 	if err != nil {
 		return err
 	}
@@ -108,7 +113,12 @@ func rp(ctx context.Context, log *logrus.Entry) error {
 
 	go database.EmitMetrics(ctx, log, dbOpenShiftClusters, m)
 
-	feCipher, err := encryption.NewXChaCha20Poly1305(ctx, _env, env.FrontendEncryptionSecretName)
+	feKey, err := _env.ServiceKeyvault().GetBase64Secret(ctx, env.FrontendEncryptionSecretName)
+	if err != nil {
+		return err
+	}
+
+	feCipher, err := encryption.NewXChaCha20Poly1305(ctx, feKey)
 	if err != nil {
 		return err
 	}
diff --git a/deploy/rp-development-predeploy.json b/deploy/rp-development-predeploy.json
index b226a2562..ab5266a5a 100644
--- a/deploy/rp-development-predeploy.json
+++ b/deploy/rp-development-predeploy.json
@@ -83,6 +83,21 @@
                             ]
                         }
                     },
+                    {
+                        "tenantId": "[subscription().tenantId]",
+                        "objectId": "[parameters('rpServicePrincipalId')]",
+                        "permissions": {
+                            "secrets": [
+                                "get"
+                            ],
+                            "certificates": [
+                                "create",
+                                "delete",
+                                "get",
+                                "update"
+                            ]
+                        }
+                    },
                     {
                         "tenantId": "[subscription().tenantId]",
                         "objectId": "[parameters('adminObjectId')]",
@@ -99,9 +114,6 @@
             "name": "[concat(parameters('keyvaultPrefix'), '-cls')]",
             "type": "Microsoft.KeyVault/vaults",
             "location": "[resourceGroup().location]",
-            "tags": {
-                "vault": "clusters"
-            },
             "apiVersion": "2016-10-01"
         },
         {
@@ -143,9 +155,6 @@
             "name": "[concat(parameters('keyvaultPrefix'), '-svc')]",
             "type": "Microsoft.KeyVault/vaults",
             "location": "[resourceGroup().location]",
-            "tags": {
-                "vault": "service"
-            },
             "apiVersion": "2016-10-01"
         }
     ]
diff --git a/deploy/rp-production-parameters.json b/deploy/rp-production-parameters.json
index 73738928e..6fc94dfc6 100644
--- a/deploy/rp-production-parameters.json
+++ b/deploy/rp-production-parameters.json
@@ -26,6 +26,9 @@
         "fullDeploy": {
             "value": false
         },
+        "keyvaultPrefix": {
+            "value": ""
+        },
         "mdmFrontendUrl": {
             "value": ""
         },
diff --git a/deploy/rp-production-predeploy.json b/deploy/rp-production-predeploy.json
index 49d07d20d..ab50e42b0 100644
--- a/deploy/rp-production-predeploy.json
+++ b/deploy/rp-production-predeploy.json
@@ -17,6 +17,21 @@
                         "update"
                     ]
                 }
+            },
+            {
+                "tenantId": "[subscription().tenantId]",
+                "objectId": "[parameters('rpServicePrincipalId')]",
+                "permissions": {
+                    "secrets": [
+                        "get"
+                    ],
+                    "certificates": [
+                        "create",
+                        "delete",
+                        "get",
+                        "update"
+                    ]
+                }
             }
         ],
         "serviceKeyvaultAccessPolicies": [
@@ -122,9 +137,6 @@
             "name": "[concat(parameters('keyvaultPrefix'), '-cls')]",
             "type": "Microsoft.KeyVault/vaults",
             "location": "[resourceGroup().location]",
-            "tags": {
-                "vault": "clusters"
-            },
             "condition": "[parameters('fullDeploy')]",
             "apiVersion": "2016-10-01"
         },
@@ -141,9 +153,6 @@
             "name": "[concat(parameters('keyvaultPrefix'), '-svc')]",
             "type": "Microsoft.KeyVault/vaults",
             "location": "[resourceGroup().location]",
-            "tags": {
-                "vault": "service"
-            },
             "condition": "[parameters('fullDeploy')]",
             "apiVersion": "2016-10-01"
         }
diff --git a/deploy/rp-production.json b/deploy/rp-production.json
index 4d91834bf..2d79b5b1e 100644
--- a/deploy/rp-production.json
+++ b/deploy/rp-production.json
@@ -28,6 +28,9 @@
             "type": "bool",
             "defaultValue": false
         },
+        "keyvaultPrefix": {
+            "type": "string"
+        },
         "mdmFrontendUrl": {
             "type": "string"
         },
@@ -229,7 +232,7 @@
                                     "autoUpgradeMinorVersion": true,
                                     "settings": {},
                                     "protectedSettings": {
-                                        "script": "[base64(concat(base64ToString('c2V0IC1leAoK'),'MDMFRONTENDURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdmFrontendUrl')),''')\n','MDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdConfigVersion')),''')\n','MDSDENVIRONMENT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdEnvironment')),''')\n','ACRRESOURCEID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('acrResourceId')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMODE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMode')),''')\n','ADMINAPICLIENTCERTCOMMONNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('adminApiClientCertCommonName')),''')\n','DATABASEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('databaseAccountName')),''')\n','ADMINAPICABUNDLE=''',parameters('adminApiCaBundle'),'''\n','MDMIMAGE=''/genevamdm:master_51''\n','LOCATION=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().location),''')\n','SUBSCRIPTIONID=$(base64 -d \u003c\u003c\u003c''',base64(subscription().subscriptionId),''')\n','RESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().name),''')\n','\n',base64ToString('Cnl1bSAteSB1cGRhdGUgLXggV0FMaW51eEFnZW50CgpsdmV4dGVuZCAtbCArNTAlRlJFRSAvZGV2L3Jvb3R2Zy9yb290bHYKeGZzX2dyb3dmcyAvCgpsdmV4dGVuZCAtbCArMTAwJUZSRUUgL2Rldi9yb290dmcvdmFybHYKeGZzX2dyb3dmcyAvdmFyCgojIGF2b2lkICJlcnJvcjogZGI1IGVycm9yKC0zMDk2OSkgZnJvbSBkYmVudi0+b3BlbjogQkRCMDA5MSBEQl9WRVJTSU9OX01JU01BVENIOiBEYXRhYmFzZSBlbnZpcm9ubWVudCB2ZXJzaW9uIG1pc21hdGNoIgpybSAtZiAvdmFyL2xpYi9ycG0vX19kYioKCnJwbSAtLWltcG9ydCBodHRwczovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsL1JQTS1HUEctS0VZLUVQRUwtNwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5mbHVlbnRiaXQuaW8vZmx1ZW50Yml0LmtleQoKZm9yIGF0dGVtcHQgaW4gezEuLjV9OyBkbwogIHl1bSAteSBpbnN0YWxsIGh0dHBzOi8vZGwuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvZXBlbC1yZWxlYXNlLWxhdGVzdC03Lm5vYXJjaC5ycG0gJiYgYnJlYWsKICBpZiBbWyAke2F0dGVtcHR9IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKY2F0ID4vZXRjL3l1bS5yZXBvcy5kL2F6dXJlLnJlcG8gPDwnRU9GJwpbYXp1cmUtY2xpXQpuYW1lPWF6dXJlLWNsaQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZS1jbGkKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9eWVzCgpbYXp1cmVjb3JlXQpuYW1lPWF6dXJlY29yZQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZWNvcmUKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9bm8KRU9GCgpjYXQgPi9ldGMveXVtLnJlcG9zLmQvdGQtYWdlbnQtYml0LnJlcG8gPDwnRU9GJwpbdGQtYWdlbnQtYml0XQpuYW1lPXRkLWFnZW50LWJpdApiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMuZmx1ZW50Yml0LmlvL2NlbnRvcy83CmVuYWJsZWQ9eWVzCmdwZ2NoZWNrPXllcwpFT0YKCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KeXVtIC15IGluc3RhbGwgYXpzZWMtY2xhbWF2IGF6c2VjLW1vbml0b3IgYXp1cmUtY2xpLTIuMTAuMSBhenVyZS1tZHNkIGF6dXJlLXNlY3VyaXR5IGRvY2tlciB0ZC1hZ2VudC1iaXQgJiYgYnJlYWsKICBpZiBbWyAke2F0dGVtcHR9IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKcnBtIC1lICQocnBtIC1xYSB8IGdyZXAgXmFicnQtKQpjYXQgPi9ldGMvc3lzY3RsLmQvMDEtZGlzYWJsZS1jb3JlLmNvbmYgPDwnRU9GJwprZXJuZWwuY29yZV9wYXR0ZXJuID0gfC9iaW4vdHJ1ZQpFT0YKc3lzY3RsIC0tc3lzdGVtCgpmaXJld2FsbC1jbWQgLS1hZGQtcG9ydD00NDMvdGNwIC0tcGVybWFuZW50CgpjYXQgPi9ldGMvdGQtYWdlbnQtYml0L3RkLWFnZW50LWJpdC5jb25mIDw8J0VPRicKW0lOUFVUXQoJTmFtZSBzeXN0ZW1kCglUYWcgam91cm5hbGQKCVN5c3RlbWRfRmlsdGVyIF9DT01NPWFybwoKW0ZJTFRFUl0KCU5hbWUgbW9kaWZ5CglNYXRjaCBqb3VybmFsZAoJUmVtb3ZlX3dpbGRjYXJkIF8KCVJlbW92ZSBUSU1FU1RBTVAKCltPVVRQVVRdCglOYW1lIGZvcndhcmQKCVBvcnQgMjkyMzAKRU9GCgpheiBsb2dpbiAtaQpheiBhY2NvdW50IHNldCAtcyAiJFNVQlNDUklQVElPTklEIgoKc3lzdGVtY3RsIHN0YXJ0IGRvY2tlci5zZXJ2aWNlCmF6IGFjciBsb2dpbiAtLW5hbWUgIiQoc2VkIC1lICdzfC4qL3x8JyA8PDwiJEFDUlJFU09VUkNFSUQiKSIKCk1ETUlNQUdFPSIke1JQSU1BR0UlJS8qfS8ke01ETUlNQUdFIyMqL30iCmRvY2tlciBwdWxsICIkTURNSU1BR0UiCmRvY2tlciBwdWxsICIkUlBJTUFHRSIKClNWQ1ZBVUxUVVJJPSIkKGF6IGtleXZhdWx0IGxpc3QgLWcgIiRSRVNPVVJDRUdST1VQTkFNRSIgLS1xdWVyeSAiWz90YWdzLnZhdWx0PT0nc2VydmljZSddLnByb3BlcnRpZXMudmF1bHRVcmkiIC1vIHRzdikiCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KICBheiBrZXl2YXVsdCBzZWNyZXQgZG93bmxvYWQgLS1maWxlIC9ldGMvbWRtLnBlbSAtLWlkICIke1NWQ1ZBVUxUVVJJfXNlY3JldHMvcnAtbWRtIiAmJiBicmVhawogIGlmIFtbICR7YXR0ZW1wdH0gLWx0IDUgXV07IHRoZW4gc2xlZXAgMTA7IGVsc2UgZXhpdCAxOyBmaQpkb25lCmNobW9kIDA2MDAgL2V0Yy9tZG0ucGVtCnNlZCAtaSAtbmUgJzEsL0VORCBDRVJUSUZJQ0FURS8gcCcgL2V0Yy9tZG0ucGVtCgpheiBrZXl2YXVsdCBzZWNyZXQgZG93bmxvYWQgLS1maWxlIC9ldGMvbWRzZC5wZW0gLS1pZCAiJHtTVkNWQVVMVFVSSX1zZWNyZXRzL3JwLW1kc2QiCmNob3duIHN5c2xvZzpzeXNsb2cgL2V0Yy9tZHNkLnBlbQpjaG1vZCAwNjAwIC9ldGMvbWRzZC5wZW0KCmF6IGxvZ291dAoKbWtkaXIgL2V0Yy9hcm8tcnAKYmFzZTY0IC1kIDw8PCIkQURNSU5BUElDQUJVTkRMRSIgPi9ldGMvYXJvLXJwL2FkbWluLWNhLWJ1bmRsZS5wZW0KY2hvd24gLVIgMTAwMDoxMDAwIC9ldGMvYXJvLXJwCgpta2RpciAvZXRjL3N5c3RlbWQvc3lzdGVtL21kc2Quc2VydmljZS5kCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZHNkLnNlcnZpY2UuZC9vdmVycmlkZS5jb25mIDw8J0VPRicKW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9kZWZhdWx0L21kc2QgPDxFT0YKTURTRF9ST0xFX1BSRUZJWD0vdmFyL3J1bi9tZHNkL2RlZmF1bHQKTURTRF9PUFRJT05TPSItQSAtZCAtciBcJE1EU0RfUk9MRV9QUkVGSVgiCgpleHBvcnQgU1NMX0NFUlRfRklMRT0vZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydAoKZXhwb3J0IE1PTklUT1JJTkdfR0NTX0VOVklST05NRU5UPSckTURTREVOVklST05NRU5UJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfQUNDT1VOVD1BUk9SUExvZ3MKZXhwb3J0IE1PTklUT1JJTkdfR0NTX1JFR0lPTj0nJExPQ0FUSU9OJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfQ0VSVF9DRVJURklMRT0vZXRjL21kc2QucGVtCmV4cG9ydCBNT05JVE9SSU5HX0dDU19DRVJUX0tFWUZJTEU9L2V0Yy9tZHNkLnBlbQpleHBvcnQgTU9OSVRPUklOR19HQ1NfTkFNRVNQQUNFPUFST1JQTG9ncwpleHBvcnQgTU9OSVRPUklOR19DT05GSUdfVkVSU0lPTj0nJE1EU0RDT05GSUdWRVJTSU9OJwpleHBvcnQgTU9OSVRPUklOR19VU0VfR0VORVZBX0NPTkZJR19TRVJWSUNFPXRydWUKCmV4cG9ydCBNT05JVE9SSU5HX1RFTkFOVD0nJExPQ0FUSU9OJwpleHBvcnQgTU9OSVRPUklOR19ST0xFPXJwCmV4cG9ydCBNT05JVE9SSU5HX1JPTEVfSU5TVEFOQ0U9JyQoaG9zdG5hbWUpJwpFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvbWRtIDw8RU9GCk1ETUZST05URU5EVVJMPSckTURNRlJPTlRFTkRVUkwnCk1ETUlNQUdFPSckTURNSU1BR0UnCk1ETVNPVVJDRUVOVklST05NRU5UPSckTE9DQVRJT04nCk1ETVNPVVJDRVJPTEU9cnAKTURNU09VUkNFUk9MRUlOU1RBTkNFPSckKGhvc3RuYW1lKScKRU9GCgpta2RpciAvdmFyL2V0dwpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vbWRtLnNlcnZpY2UgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKUmVxdWlyZXM9ZG9ja2VyLnNlcnZpY2UKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvbWRtCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWVudHJ5cG9pbnQgL3Vzci9zYmluL01ldHJpY3NFeHRlbnNpb24gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLW0gMmcgXAogIC12IC9ldGMvbWRtLnBlbTovZXRjL21kbS5wZW0gXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRNRE1JTUFHRSBcCiAgLUNlcnRGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLUZyb250RW5kVXJsICRNRE1GUk9OVEVORFVSTCBcCiAgLUxvZ2dlciBDb25zb2xlIFwKICAtTG9nTGV2ZWwgV2FybmluZyBcCiAgLVByaXZhdGVLZXlGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLVNvdXJjZUVudmlyb25tZW50ICRNRE1TT1VSQ0VFTlZJUk9OTUVOVCBcCiAgLVNvdXJjZVJvbGUgJE1ETVNPVVJDRVJPTEUgXAogIC1Tb3VyY2VSb2xlSW5zdGFuY2UgJE1ETVNPVVJDRVJPTEVJTlNUQU5DRQpFeGVjU3RvcD0vdXNyL2Jpbi9kb2NrZXIgc3RvcCAlTgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvYXJvLXJwIDw8RU9GCk1ETV9BQ0NPVU5UPUF6dXJlUmVkSGF0T3BlblNoaWZ0UlAKTURNX05BTUVTUEFDRT1SUApBQ1JfUkVTT1VSQ0VfSUQ9JyRBQ1JSRVNPVVJDRUlEJwpBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUU9JyRBRE1JTkFQSUNMSUVOVENFUlRDT01NT05OQU1FJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpSUElNQUdFPSckUlBJTUFHRScKUlBfTU9ERT0nJFJQTU9ERScKRU9GCgpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLXJwLnNlcnZpY2UgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKUmVxdWlyZXM9ZG9ja2VyLnNlcnZpY2UKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvYXJvLXJwCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIERBVEFCQVNFX0FDQ09VTlRfTkFNRSBcCiAgLWUgUlBfTU9ERSBcCiAgLWUgQUNSX1JFU09VUkNFX0lEIFwKICAtbSAyZyBcCiAgLXAgNDQzOjg0NDMgXAogIC12IC9ldGMvYXJvLXJwOi9ldGMvYXJvLXJwIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJFJQSU1BR0UgXAogIHJwCkV4ZWNTdG9wPS91c3IvYmluL2RvY2tlciBzdG9wIC10IDM2MDAgJU4KVGltZW91dFN0b3BTZWM9MzYwMApSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvYXJvLW1vbml0b3IgPDxFT0YKTURNX0FDQ09VTlQ9QXp1cmVSZWRIYXRPcGVuU2hpZnRSUApNRE1fTkFNRVNQQUNFPUJCTQpDTFVTVEVSX01ETV9BQ0NPVU5UPUF6dXJlUmVkSGF0T3BlblNoaWZ0Q2x1c3RlcgpDTFVTVEVSX01ETV9OQU1FU1BBQ0U9QkJNCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnClJQSU1BR0U9JyRSUElNQUdFJwpSUF9NT0RFPSckUlBNT0RFJwpFT0YKCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tbW9uaXRvci5zZXJ2aWNlIDw8J0VPRicKW1VuaXRdCkFmdGVyPWRvY2tlci5zZXJ2aWNlClJlcXVpcmVzPWRvY2tlci5zZXJ2aWNlCgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL2Fyby1tb25pdG9yCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC1lIENMVVNURVJfTURNX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURNX05BTUVTUEFDRSBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBNRE1fQUNDT1VOVCBcCiAgLWUgTURNX05BTUVTUEFDRSBcCiAgLWUgUlBfTU9ERSBcCiAgLW0gMmcgXAogIC12IC9ydW4vc3lzdGVtZC9qb3VybmFsOi9ydW4vc3lzdGVtZC9qb3VybmFsIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkUlBJTUFHRSBcCiAgbW9uaXRvcgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNoY29uIC1SIHN5c3RlbV91Om9iamVjdF9yOnZhcl9sb2dfdDpzMCAvdmFyL29wdC9taWNyb3NvZnQvbGludXhtb25hZ2VudAoKZm9yIHNlcnZpY2UgaW4gYXJvLW1vbml0b3IgYXJvLXJwIGF1b21zIGF6c2VjZCBhenNlY21vbmQgbWRzZCBtZG0gY2hyb255ZCB0ZC1hZ2VudC1iaXQ7IGRvCiAgc3lzdGVtY3RsIGVuYWJsZSAkc2VydmljZS5zZXJ2aWNlCmRvbmUKCmZvciBzY2FuIGluIGJhc2VsaW5lIGNsYW1hdiBzb2Z0d2FyZTsgZG8KICAvdXNyL2xvY2FsL2Jpbi9henNlY2QgY29uZmlnIC1zICRzY2FuIC1kIFAxRApkb25lCgooc2xlZXAgMzA7IHJlYm9vdCkgJgo=')))]"
+                                        "script": "[base64(concat(base64ToString('c2V0IC1leAoK'),'MDMFRONTENDURL=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdmFrontendUrl')),''')\n','MDSDCONFIGVERSION=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdConfigVersion')),''')\n','MDSDENVIRONMENT=$(base64 -d \u003c\u003c\u003c''',base64(parameters('mdsdEnvironment')),''')\n','ACRRESOURCEID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('acrResourceId')),''')\n','DOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('domainName')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMODE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMode')),''')\n','ADMINAPICLIENTCERTCOMMONNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('adminApiClientCertCommonName')),''')\n','DATABASEACCOUNTNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('databaseAccountName')),''')\n','KEYVAULTPREFIX=$(base64 -d \u003c\u003c\u003c''',base64(parameters('keyvaultPrefix')),''')\n','ADMINAPICABUNDLE=''',parameters('adminApiCaBundle'),'''\n','MDMIMAGE=''/genevamdm:master_51''\n','LOCATION=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().location),''')\n','SUBSCRIPTIONID=$(base64 -d \u003c\u003c\u003c''',base64(subscription().subscriptionId),''')\n','RESOURCEGROUPNAME=$(base64 -d \u003c\u003c\u003c''',base64(resourceGroup().name),''')\n','\n',base64ToString('Cnl1bSAteSB1cGRhdGUgLXggV0FMaW51eEFnZW50CgpsdmV4dGVuZCAtbCArNTAlRlJFRSAvZGV2L3Jvb3R2Zy9yb290bHYKeGZzX2dyb3dmcyAvCgpsdmV4dGVuZCAtbCArMTAwJUZSRUUgL2Rldi9yb290dmcvdmFybHYKeGZzX2dyb3dmcyAvdmFyCgojIGF2b2lkICJlcnJvcjogZGI1IGVycm9yKC0zMDk2OSkgZnJvbSBkYmVudi0+b3BlbjogQkRCMDA5MSBEQl9WRVJTSU9OX01JU01BVENIOiBEYXRhYmFzZSBlbnZpcm9ubWVudCB2ZXJzaW9uIG1pc21hdGNoIgpybSAtZiAvdmFyL2xpYi9ycG0vX19kYioKCnJwbSAtLWltcG9ydCBodHRwczovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsL1JQTS1HUEctS0VZLUVQRUwtNwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5mbHVlbnRiaXQuaW8vZmx1ZW50Yml0LmtleQoKZm9yIGF0dGVtcHQgaW4gezEuLjV9OyBkbwogIHl1bSAteSBpbnN0YWxsIGh0dHBzOi8vZGwuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvZXBlbC1yZWxlYXNlLWxhdGVzdC03Lm5vYXJjaC5ycG0gJiYgYnJlYWsKICBpZiBbWyAke2F0dGVtcHR9IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKY2F0ID4vZXRjL3l1bS5yZXBvcy5kL2F6dXJlLnJlcG8gPDwnRU9GJwpbYXp1cmUtY2xpXQpuYW1lPWF6dXJlLWNsaQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZS1jbGkKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9eWVzCgpbYXp1cmVjb3JlXQpuYW1lPWF6dXJlY29yZQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZWNvcmUKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9bm8KRU9GCgpjYXQgPi9ldGMveXVtLnJlcG9zLmQvdGQtYWdlbnQtYml0LnJlcG8gPDwnRU9GJwpbdGQtYWdlbnQtYml0XQpuYW1lPXRkLWFnZW50LWJpdApiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMuZmx1ZW50Yml0LmlvL2NlbnRvcy83CmVuYWJsZWQ9eWVzCmdwZ2NoZWNrPXllcwpFT0YKCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KeXVtIC15IGluc3RhbGwgYXpzZWMtY2xhbWF2IGF6c2VjLW1vbml0b3IgYXp1cmUtY2xpLTIuMTAuMSBhenVyZS1tZHNkIGF6dXJlLXNlY3VyaXR5IGRvY2tlciB0ZC1hZ2VudC1iaXQgJiYgYnJlYWsKICBpZiBbWyAke2F0dGVtcHR9IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKcnBtIC1lICQocnBtIC1xYSB8IGdyZXAgXmFicnQtKQpjYXQgPi9ldGMvc3lzY3RsLmQvMDEtZGlzYWJsZS1jb3JlLmNvbmYgPDwnRU9GJwprZXJuZWwuY29yZV9wYXR0ZXJuID0gfC9iaW4vdHJ1ZQpFT0YKc3lzY3RsIC0tc3lzdGVtCgpmaXJld2FsbC1jbWQgLS1hZGQtcG9ydD00NDMvdGNwIC0tcGVybWFuZW50CgpjYXQgPi9ldGMvdGQtYWdlbnQtYml0L3RkLWFnZW50LWJpdC5jb25mIDw8J0VPRicKW0lOUFVUXQoJTmFtZSBzeXN0ZW1kCglUYWcgam91cm5hbGQKCVN5c3RlbWRfRmlsdGVyIF9DT01NPWFybwoKW0ZJTFRFUl0KCU5hbWUgbW9kaWZ5CglNYXRjaCBqb3VybmFsZAoJUmVtb3ZlX3dpbGRjYXJkIF8KCVJlbW92ZSBUSU1FU1RBTVAKCltPVVRQVVRdCglOYW1lIGZvcndhcmQKCVBvcnQgMjkyMzAKRU9GCgpheiBsb2dpbiAtaQpheiBhY2NvdW50IHNldCAtcyAiJFNVQlNDUklQVElPTklEIgoKc3lzdGVtY3RsIHN0YXJ0IGRvY2tlci5zZXJ2aWNlCmF6IGFjciBsb2dpbiAtLW5hbWUgIiQoc2VkIC1lICdzfC4qL3x8JyA8PDwiJEFDUlJFU09VUkNFSUQiKSIKCk1ETUlNQUdFPSIke1JQSU1BR0UlJS8qfS8ke01ETUlNQUdFIyMqL30iCmRvY2tlciBwdWxsICIkTURNSU1BR0UiCmRvY2tlciBwdWxsICIkUlBJTUFHRSIKCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KICBheiBrZXl2YXVsdCBzZWNyZXQgZG93bmxvYWQgLS1maWxlIC9ldGMvbWRtLnBlbSAtLWlkICJodHRwczovLyRLRVlWQVVMVFBSRUZJWC1zdmMudmF1bHQuYXp1cmUubmV0L3NlY3JldHMvcnAtbWRtIiAmJiBicmVhawogIGlmIFtbICR7YXR0ZW1wdH0gLWx0IDUgXV07IHRoZW4gc2xlZXAgMTA7IGVsc2UgZXhpdCAxOyBmaQpkb25lCmNobW9kIDA2MDAgL2V0Yy9tZG0ucGVtCnNlZCAtaSAtbmUgJzEsL0VORCBDRVJUSUZJQ0FURS8gcCcgL2V0Yy9tZG0ucGVtCgpheiBrZXl2YXVsdCBzZWNyZXQgZG93bmxvYWQgLS1maWxlIC9ldGMvbWRzZC5wZW0gLS1pZCAiaHR0cHM6Ly8kS0VZVkFVTFRQUkVGSVgtc3ZjLnZhdWx0LmF6dXJlLm5ldC9zZWNyZXRzL3JwLW1kc2QiCmNob3duIHN5c2xvZzpzeXNsb2cgL2V0Yy9tZHNkLnBlbQpjaG1vZCAwNjAwIC9ldGMvbWRzZC5wZW0KCmF6IGxvZ291dAoKbWtkaXIgL2V0Yy9hcm8tcnAKYmFzZTY0IC1kIDw8PCIkQURNSU5BUElDQUJVTkRMRSIgPi9ldGMvYXJvLXJwL2FkbWluLWNhLWJ1bmRsZS5wZW0KY2hvd24gLVIgMTAwMDoxMDAwIC9ldGMvYXJvLXJwCgpta2RpciAvZXRjL3N5c3RlbWQvc3lzdGVtL21kc2Quc2VydmljZS5kCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZHNkLnNlcnZpY2UuZC9vdmVycmlkZS5jb25mIDw8J0VPRicKW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9kZWZhdWx0L21kc2QgPDxFT0YKTURTRF9ST0xFX1BSRUZJWD0vdmFyL3J1bi9tZHNkL2RlZmF1bHQKTURTRF9PUFRJT05TPSItQSAtZCAtciBcJE1EU0RfUk9MRV9QUkVGSVgiCgpleHBvcnQgU1NMX0NFUlRfRklMRT0vZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydAoKZXhwb3J0IE1PTklUT1JJTkdfR0NTX0VOVklST05NRU5UPSckTURTREVOVklST05NRU5UJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfQUNDT1VOVD1BUk9SUExvZ3MKZXhwb3J0IE1PTklUT1JJTkdfR0NTX1JFR0lPTj0nJExPQ0FUSU9OJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfQ0VSVF9DRVJURklMRT0vZXRjL21kc2QucGVtCmV4cG9ydCBNT05JVE9SSU5HX0dDU19DRVJUX0tFWUZJTEU9L2V0Yy9tZHNkLnBlbQpleHBvcnQgTU9OSVRPUklOR19HQ1NfTkFNRVNQQUNFPUFST1JQTG9ncwpleHBvcnQgTU9OSVRPUklOR19DT05GSUdfVkVSU0lPTj0nJE1EU0RDT05GSUdWRVJTSU9OJwpleHBvcnQgTU9OSVRPUklOR19VU0VfR0VORVZBX0NPTkZJR19TRVJWSUNFPXRydWUKCmV4cG9ydCBNT05JVE9SSU5HX1RFTkFOVD0nJExPQ0FUSU9OJwpleHBvcnQgTU9OSVRPUklOR19ST0xFPXJwCmV4cG9ydCBNT05JVE9SSU5HX1JPTEVfSU5TVEFOQ0U9JyQoaG9zdG5hbWUpJwpFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvbWRtIDw8RU9GCk1ETUZST05URU5EVVJMPSckTURNRlJPTlRFTkRVUkwnCk1ETUlNQUdFPSckTURNSU1BR0UnCk1ETVNPVVJDRUVOVklST05NRU5UPSckTE9DQVRJT04nCk1ETVNPVVJDRVJPTEU9cnAKTURNU09VUkNFUk9MRUlOU1RBTkNFPSckKGhvc3RuYW1lKScKRU9GCgpta2RpciAvdmFyL2V0dwpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vbWRtLnNlcnZpY2UgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKUmVxdWlyZXM9ZG9ja2VyLnNlcnZpY2UKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvbWRtCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWVudHJ5cG9pbnQgL3Vzci9zYmluL01ldHJpY3NFeHRlbnNpb24gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLW0gMmcgXAogIC12IC9ldGMvbWRtLnBlbTovZXRjL21kbS5wZW0gXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRNRE1JTUFHRSBcCiAgLUNlcnRGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLUZyb250RW5kVXJsICRNRE1GUk9OVEVORFVSTCBcCiAgLUxvZ2dlciBDb25zb2xlIFwKICAtTG9nTGV2ZWwgV2FybmluZyBcCiAgLVByaXZhdGVLZXlGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLVNvdXJjZUVudmlyb25tZW50ICRNRE1TT1VSQ0VFTlZJUk9OTUVOVCBcCiAgLVNvdXJjZVJvbGUgJE1ETVNPVVJDRVJPTEUgXAogIC1Tb3VyY2VSb2xlSW5zdGFuY2UgJE1ETVNPVVJDRVJPTEVJTlNUQU5DRQpFeGVjU3RvcD0vdXNyL2Jpbi9kb2NrZXIgc3RvcCAlTgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvYXJvLXJwIDw8RU9GCk1ETV9BQ0NPVU5UPUF6dXJlUmVkSGF0T3BlblNoaWZ0UlAKTURNX05BTUVTUEFDRT1SUApBQ1JfUkVTT1VSQ0VfSUQ9JyRBQ1JSRVNPVVJDRUlEJwpBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUU9JyRBRE1JTkFQSUNMSUVOVENFUlRDT01NT05OQU1FJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpET01BSU5fTkFNRT0nJERPTUFJTk5BTUUnCktFWVZBVUxUX1BSRUZJWD0nJEtFWVZBVUxUUFJFRklYJwpSUElNQUdFPSckUlBJTUFHRScKUlBfTU9ERT0nJFJQTU9ERScKRU9GCgpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLXJwLnNlcnZpY2UgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKUmVxdWlyZXM9ZG9ja2VyLnNlcnZpY2UKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvYXJvLXJwCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIERBVEFCQVNFX0FDQ09VTlRfTkFNRSBcCiAgLWUgRE9NQUlOX05BTUUgXAogIC1lIEtFWVZBVUxUX1BSRUZJWCBcCiAgLWUgUlBfTU9ERSBcCiAgLWUgQUNSX1JFU09VUkNFX0lEIFwKICAtbSAyZyBcCiAgLXAgNDQzOjg0NDMgXAogIC12IC9ldGMvYXJvLXJwOi9ldGMvYXJvLXJwIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJFJQSU1BR0UgXAogIHJwCkV4ZWNTdG9wPS91c3IvYmluL2RvY2tlciBzdG9wIC10IDM2MDAgJU4KVGltZW91dFN0b3BTZWM9MzYwMApSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvYXJvLW1vbml0b3IgPDxFT0YKTURNX0FDQ09VTlQ9QXp1cmVSZWRIYXRPcGVuU2hpZnRSUApNRE1fTkFNRVNQQUNFPUJCTQpDTFVTVEVSX01ETV9BQ0NPVU5UPUF6dXJlUmVkSGF0T3BlblNoaWZ0Q2x1c3RlcgpDTFVTVEVSX01ETV9OQU1FU1BBQ0U9QkJNCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCktFWVZBVUxUX1BSRUZJWD0nJEtFWVZBVUxUUFJFRklYJwpSUElNQUdFPSckUlBJTUFHRScKUlBfTU9ERT0nJFJQTU9ERScKRU9GCgpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLW1vbml0b3Iuc2VydmljZSA8PCdFT0YnCltVbml0XQpBZnRlcj1kb2NrZXIuc2VydmljZQpSZXF1aXJlcz1kb2NrZXIuc2VydmljZQoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tbW9uaXRvcgpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtZSBDTFVTVEVSX01ETV9BQ0NPVU5UIFwKICAtZSBDTFVTVEVSX01ETV9OQU1FU1BBQ0UgXAogIC1lIERBVEFCQVNFX0FDQ09VTlRfTkFNRSBcCiAgLWUgS0VZVkFVTFRfUFJFRklYIFwKICAtZSBNRE1fQUNDT1VOVCBcCiAgLWUgTURNX05BTUVTUEFDRSBcCiAgLWUgUlBfTU9ERSBcCiAgLW0gMmcgXAogIC12IC9ydW4vc3lzdGVtZC9qb3VybmFsOi9ydW4vc3lzdGVtZC9qb3VybmFsIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkUlBJTUFHRSBcCiAgbW9uaXRvcgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNoY29uIC1SIHN5c3RlbV91Om9iamVjdF9yOnZhcl9sb2dfdDpzMCAvdmFyL29wdC9taWNyb3NvZnQvbGludXhtb25hZ2VudAoKZm9yIHNlcnZpY2UgaW4gYXJvLW1vbml0b3IgYXJvLXJwIGF1b21zIGF6c2VjZCBhenNlY21vbmQgbWRzZCBtZG0gY2hyb255ZCB0ZC1hZ2VudC1iaXQ7IGRvCiAgc3lzdGVtY3RsIGVuYWJsZSAkc2VydmljZS5zZXJ2aWNlCmRvbmUKCmZvciBzY2FuIGluIGJhc2VsaW5lIGNsYW1hdiBzb2Z0d2FyZTsgZG8KICAvdXNyL2xvY2FsL2Jpbi9henNlY2QgY29uZmlnIC1zICRzY2FuIC1kIFAxRApkb25lCgooc2xlZXAgMzA7IHJlYm9vdCkgJgo=')))]"
                                     }
                                 }
                             }
diff --git a/docs/authorizers.md b/docs/authorizers.md
index bd0c971da..9eec3aeb8 100644
--- a/docs/authorizers.md
+++ b/docs/authorizers.md
@@ -20,22 +20,17 @@ in development mode to emulate ARM.
 The first party application, in the AME tenant, for use against ARM. Used in
 steady state: manage ACR tokens, DNS zone records, private endpoints.
 
-## localFPKVAuthorizer
-
-The first party application, in the AME tenant, for use against the cluster key
-vault. Used in steady state: manage cluster serving certificates.
-
 ## rpAuthorizer
 
 The managed identity attached to the RP VM, in the AME tenant, for use against
-ARM. Used for bootstrapping: finding the CosmosDB account and key, finding the
-DNS zone, finding the key vaults, populating the SKU list.
+ARM. Used for bootstrapping: finding the CosmosDB key, populating the SKU list.
 
 ## rpKVAuthorizer
 
 The managed identity attached to the RP VM, in the AME tenant, for use against
-the service key vault. Used for bootstrapping: retrieving keys and secrets from
-the service key vault, including the first party certificate + key.
+the service and cluster key vault. Used for bootstrapping: retrieving keys and
+secrets from the service key vault, including the first party certificate + key.
+Used in steady state: manage cluster serving certificates.
 
 ## spAuthorizer
 
diff --git a/docs/deploy-development-rp.md b/docs/deploy-development-rp.md
index 009e26e91..263a45ce2 100644
--- a/docs/deploy-development-rp.md
+++ b/docs/deploy-development-rp.md
@@ -112,7 +112,7 @@
      -n "databases-development-$USER" \
      --template-file deploy/databases-development.json \
      --parameters \
-       "databaseAccountName=$COSMOSDB_ACCOUNT" \
+       "databaseAccountName=$DATABASE_ACCOUNT_NAME" \
        "databaseName=$DATABASE_NAME" \
      >/dev/null
    ```
diff --git a/docs/prepare-a-shared-rp-development-environment.md b/docs/prepare-a-shared-rp-development-environment.md
index e22754e61..2920e65d6 100644
--- a/docs/prepare-a-shared-rp-development-environment.md
+++ b/docs/prepare-a-shared-rp-development-environment.md
@@ -268,12 +268,12 @@ locations.
    export RP_MODE='development'
    export PULL_SECRET='$PULL_SECRET'
    export SECRET_SA_ACCOUNT_NAME='$SECRET_SA_ACCOUNT_NAME'
+   export DATABASE_ACCOUNT_NAME="\$RESOURCEGROUP"
+   export KEYVAULT_PREFIX="\$RESOURCEGROUP"
    ADMIN_OBJECT_ID='$ADMIN_OBJECT_ID'
-   COSMOSDB_ACCOUNT="\$RESOURCEGROUP"
-   DOMAIN_NAME="\$RESOURCEGROUP"
-   KEYVAULT_PREFIX="\$RESOURCEGROUP"
    PARENT_DOMAIN_NAME='$PARENT_DOMAIN_NAME'
    PARENT_DOMAIN_RESOURCEGROUP='$PARENT_DOMAIN_RESOURCEGROUP'
+   export DOMAIN_NAME="\$RESOURCEGROUP.\$PARENT_DOMAIN_NAME"
    EOF
    ```
 
diff --git a/hack/db/db.go b/hack/db/db.go
index b7e2622b1..dd96d7b22 100644
--- a/hack/db/db.go
+++ b/hack/db/db.go
@@ -13,9 +13,11 @@ import (
 	"github.com/sirupsen/logrus"
 
 	"github.com/Azure/ARO-RP/pkg/database"
+	"github.com/Azure/ARO-RP/pkg/deploy/generator"
 	"github.com/Azure/ARO-RP/pkg/env"
 	"github.com/Azure/ARO-RP/pkg/metrics/noop"
 	"github.com/Azure/ARO-RP/pkg/util/encryption"
+	"github.com/Azure/ARO-RP/pkg/util/keyvault"
 	utillog "github.com/Azure/ARO-RP/pkg/util/log"
 )
 
@@ -29,7 +31,24 @@ func run(ctx context.Context, log *logrus.Entry) error {
 		return err
 	}
 
-	cipher, err := encryption.NewXChaCha20Poly1305(ctx, _env, env.EncryptionSecretName)
+	rpKVAuthorizer, err := _env.NewRPAuthorizer(_env.Environment().ResourceIdentifiers.KeyVault)
+	if err != nil {
+		return err
+	}
+
+	serviceKeyvaultURI, err := keyvault.URI(_env, generator.ServiceKeyvaultSuffix)
+	if err != nil {
+		return err
+	}
+
+	serviceKeyvault := keyvault.NewManager(rpKVAuthorizer, serviceKeyvaultURI)
+
+	key, err := serviceKeyvault.GetBase64Secret(ctx, env.EncryptionSecretName)
+	if err != nil {
+		return err
+	}
+
+	cipher, err := encryption.NewXChaCha20Poly1305(ctx, key)
 	if err != nil {
 		return err
 	}
diff --git a/hack/devtools/deploy-shared-env.sh b/hack/devtools/deploy-shared-env.sh
index d01ace948..ea1f767ca 100644
--- a/hack/devtools/deploy-shared-env.sh
+++ b/hack/devtools/deploy-shared-env.sh
@@ -26,8 +26,8 @@ deploy_rp_dev() {
         -n rp-development \
         --template-file deploy/rp-development.json \
         --parameters \
-            "databaseAccountName=$COSMOSDB_ACCOUNT" \
-            "domainName=$DOMAIN_NAME.$PARENT_DOMAIN_NAME" \
+            "databaseAccountName=$DATABASE_ACCOUNT_NAME" \
+            "domainName=$DOMAIN_NAME" \
             "fpServicePrincipalId=$(az ad sp list --filter "appId eq '$AZURE_FP_CLIENT_ID'" --query '[].objectId' -o tsv)" \
             "rpServicePrincipalId=$(az ad sp list --filter "appId eq '$AZURE_RP_CLIENT_ID'" --query '[].objectId' -o tsv)" >/dev/null
 }
@@ -109,19 +109,19 @@ import_certs_secrets() {
 }
 
 update_parent_domain_dns_zone() {
-    echo "########## Creating NS record to DNS Zone $DOMAIN_NAME in $PARENT_DOMAIN_NAME | RG $PARENT_DOMAIN_RESOURCEGROUP ##########"
+    echo "########## Creating NS record to DNS Zone $RESOURCEGROUP in $PARENT_DOMAIN_NAME | RG $PARENT_DOMAIN_RESOURCEGROUP ##########"
     az network dns record-set ns create \
         --resource-group "$PARENT_DOMAIN_RESOURCEGROUP" \
         --zone "$PARENT_DOMAIN_NAME" \
-        --name "$DOMAIN_NAME" >/dev/null
+        --name "$RESOURCEGROUP" >/dev/null
     for ns in $(az network dns zone show \
         --resource-group "$RESOURCEGROUP" \
-        --name "$DOMAIN_NAME.$PARENT_DOMAIN_NAME" \
+        --name "$DOMAIN_NAME" \
         --query nameServers -o tsv); do
         az network dns record-set ns add-record \
           --resource-group "$PARENT_DOMAIN_RESOURCEGROUP" \
           --zone "$PARENT_DOMAIN_NAME" \
-          --record-set-name "$DOMAIN_NAME" \
+          --record-set-name "$RESOURCEGROUP" \
           --nsdname "$ns" >/dev/null
       done
 }
@@ -154,15 +154,15 @@ clean_env() {
     az network dns record-set ns delete \
         --resource-group "$PARENT_DOMAIN_RESOURCEGROUP" \
         --zone "$PARENT_DOMAIN_NAME" \
-        --name "$DOMAIN_NAME"
+        --name "$RESOURCEGROUP"
     for ns in $(az network dns zone show \
         --resource-group "$RESOURCEGROUP" \
-        --name "$DOMAIN_NAME.$PARENT_DOMAIN_NAME" \
+        --name "$DOMAIN_NAME" \
         --query nameServers -o tsv); do
         az network dns record-set ns remove-record \
           --resource-group "$PARENT_DOMAIN_RESOURCEGROUP" \
           --zone "$PARENT_DOMAIN_NAME" \
-          --record-set-name "$DOMAIN_NAME" \
+          --record-set-name "$RESOURCEGROUP" \
           --nsdname "$ns"
       done
 }
@@ -176,13 +176,12 @@ echo "AZURE_SUBSCRIPTION_ID=$AZURE_SUBSCRIPTION_ID"
 echo
 echo "LOCATION=$LOCATION"
 echo
-echo "COSMOSDB_ACCOUNT=$COSMOSDB_ACCOUNT"
+echo "DATABASE_ACCOUNT_NAME=$DATABASE_ACCOUNT_NAME"
 echo
 echo "ADMIN_OBJECT_ID=$ADMIN_OBJECT_ID"
 echo "AZURE_RP_CLIENT_ID=$AZURE_RP_CLIENT_ID"
 echo "AZURE_FP_CLIENT_ID=$AZURE_FP_CLIENT_ID"
 echo
-echo "DOMAIN_NAME=$DOMAIN_NAME"
 echo "PARENT_DOMAIN_NAME=$PARENT_DOMAIN_NAME"
 echo "PARENT_DOMAIN_RESOURCEGROUP=$PARENT_DOMAIN_RESOURCEGROUP"
 echo
@@ -194,9 +193,8 @@ echo "######################################"
 [ "$LOCATION" ] || ( echo ">> LOCATION is not set please validate your ./secrets/env"; exit 128 )
 [ "$RESOURCEGROUP" ] || ( echo ">> RESOURCEGROUP is not set please validate your ./secrets/env"; exit 128 )
 [ "$PROXY_HOSTNAME" ] || ( echo ">> PROXY_HOSTNAME is not set please validate your ./secrets/env"; exit 128 )
-[ "$COSMOSDB_ACCOUNT" ] || ( echo ">> COSMOSDB_ACCOUNT is not set please validate your ./secrets/env"; exit 128 )
+[ "$DATABASE_ACCOUNT_NAME" ] || ( echo ">> DATABASE_ACCOUNT_NAME is not set please validate your ./secrets/env"; exit 128 )
 [ "$ADMIN_OBJECT_ID" ] || ( echo ">> ADMIN_OBJECT_ID is not set please validate your ./secrets/env"; exit 128 )
-[ "$DOMAIN_NAME" ] || ( echo ">> DOMAIN_NAME is not set please validate your ./secrets/env"; exit 128 )
 [ "$PARENT_DOMAIN_NAME" ] || ( echo ">> PARENT_DOMAIN_NAME is not set please validate your ./secrets/env"; exit 128 )
 [ "$AZURE_FP_CLIENT_ID" ] || ( echo ">> AZURE_FP_CLIENT_ID is not set please validate your ./secrets/env"; exit 128 )
 [ "$KEYVAULT_PREFIX" ] || ( echo ">> KEYVAULT_PREFIX is not set please validate your ./secrets/env"; exit 128 )
diff --git a/pkg/backend/openshiftcluster/openshiftcluster.go b/pkg/backend/openshiftcluster/openshiftcluster.go
index d6e74c49c..ac06f1e9d 100644
--- a/pkg/backend/openshiftcluster/openshiftcluster.go
+++ b/pkg/backend/openshiftcluster/openshiftcluster.go
@@ -20,7 +20,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	"github.com/Azure/ARO-RP/pkg/util/dns"
 	"github.com/Azure/ARO-RP/pkg/util/encryption"
-	"github.com/Azure/ARO-RP/pkg/util/keyvault"
 	"github.com/Azure/ARO-RP/pkg/util/privateendpoint"
 	"github.com/Azure/ARO-RP/pkg/util/subnet"
 )
@@ -48,7 +47,6 @@ type manager struct {
 	securityGroups network.SecurityGroupsClient
 
 	dns             dns.Manager
-	keyvault        keyvault.Manager
 	privateendpoint privateendpoint.Manager
 	subnet          subnet.Manager
 	acrtoken        pkgacrtoken.Manager
@@ -64,11 +62,6 @@ func NewManager(log *logrus.Entry, _env env.Interface, db database.OpenShiftClus
 		return nil, err
 	}
 
-	localFPKVAuthorizer, err := _env.FPAuthorizer(_env.TenantID(), _env.Environment().ResourceIdentifiers.KeyVault)
-	if err != nil {
-		return nil, err
-	}
-
 	fpAuthorizer, err := _env.FPAuthorizer(subscriptionDoc.Subscription.Properties.TenantID, _env.Environment().ResourceManagerEndpoint)
 	if err != nil {
 		return nil, err
@@ -101,7 +94,6 @@ func NewManager(log *logrus.Entry, _env env.Interface, db database.OpenShiftClus
 		securityGroups: network.NewSecurityGroupsClient(subscriptionDoc.ID, fpAuthorizer),
 
 		dns:             dns.NewManager(_env, localFPAuthorizer),
-		keyvault:        keyvault.NewManager(localFPKVAuthorizer, _env.ClustersKeyvaultURI()),
 		privateendpoint: privateendpoint.NewManager(_env, localFPAuthorizer),
 		acrtoken:        acrtoken,
 		subnet:          subnet.NewManager(subscriptionDoc.ID, fpAuthorizer),
diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go
index c22705f47..c81e1544d 100644
--- a/pkg/cluster/cluster.go
+++ b/pkg/cluster/cluster.go
@@ -30,7 +30,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/billing"
 	"github.com/Azure/ARO-RP/pkg/util/dns"
 	"github.com/Azure/ARO-RP/pkg/util/encryption"
-	"github.com/Azure/ARO-RP/pkg/util/keyvault"
 	"github.com/Azure/ARO-RP/pkg/util/privateendpoint"
 	"github.com/Azure/ARO-RP/pkg/util/refreshable"
 	"github.com/Azure/ARO-RP/pkg/util/subnet"
@@ -67,7 +66,6 @@ type manager struct {
 	storageAccounts     storage.AccountsClient
 
 	dns             dns.Manager
-	keyvault        keyvault.Manager
 	privateendpoint privateendpoint.Manager
 	subnet          subnet.Manager
 
@@ -95,11 +93,6 @@ func NewManager(ctx context.Context, log *logrus.Entry, _env env.Interface, db d
 		return nil, err
 	}
 
-	localFPKVAuthorizer, err := _env.FPAuthorizer(_env.TenantID(), _env.Environment().ResourceIdentifiers.KeyVault)
-	if err != nil {
-		return nil, err
-	}
-
 	fpAuthorizer, err := _env.FPAuthorizer(doc.OpenShiftCluster.Properties.ServicePrincipalProfile.TenantID, _env.Environment().ResourceManagerEndpoint)
 	if err != nil {
 		return nil, err
@@ -129,7 +122,6 @@ func NewManager(ctx context.Context, log *logrus.Entry, _env env.Interface, db d
 		storageAccounts:     storage.NewAccountsClient(r.SubscriptionID, fpAuthorizer),
 
 		dns:             dns.NewManager(_env, localFPAuthorizer),
-		keyvault:        keyvault.NewManager(localFPKVAuthorizer, _env.ClustersKeyvaultURI()),
 		privateendpoint: privateendpoint.NewManager(_env, localFPAuthorizer),
 		subnet:          subnet.NewManager(r.SubscriptionID, fpAuthorizer),
 	}, nil
diff --git a/pkg/cluster/delete.go b/pkg/cluster/delete.go
index 366fbaf4f..bc56b2dc9 100644
--- a/pkg/cluster/delete.go
+++ b/pkg/cluster/delete.go
@@ -244,13 +244,13 @@ func (m *manager) Delete(ctx context.Context) error {
 
 		if managedDomain != "" {
 			m.log.Print("deleting signed apiserver certificate")
-			err = m.keyvault.EnsureCertificateDeleted(ctx, m.doc.ID+"-apiserver")
+			err = m.env.ClustersKeyvault().EnsureCertificateDeleted(ctx, m.doc.ID+"-apiserver")
 			if err != nil {
 				return err
 			}
 
 			m.log.Print("deleting signed ingress certificate")
-			err = m.keyvault.EnsureCertificateDeleted(ctx, m.doc.ID+"-ingress")
+			err = m.env.ClustersKeyvault().EnsureCertificateDeleted(ctx, m.doc.ID+"-ingress")
 			if err != nil {
 				return err
 			}
diff --git a/pkg/cluster/tls.go b/pkg/cluster/tls.go
index 9e0bbc755..5e2c0a9bf 100644
--- a/pkg/cluster/tls.go
+++ b/pkg/cluster/tls.go
@@ -51,7 +51,7 @@ func (m *manager) createCertificates(ctx context.Context) error {
 
 	for _, c := range certs {
 		m.log.Printf("creating certificate %s", c.certificateName)
-		err = m.keyvault.CreateSignedCertificate(ctx, keyvault.IssuerDigicert, c.certificateName, c.commonName, keyvault.EkuServerAuth)
+		err = m.env.ClustersKeyvault().CreateSignedCertificate(ctx, keyvault.IssuerDigicert, c.certificateName, c.commonName, keyvault.EkuServerAuth)
 		if err != nil {
 			return err
 		}
@@ -59,7 +59,7 @@ func (m *manager) createCertificates(ctx context.Context) error {
 
 	for _, c := range certs {
 		m.log.Printf("waiting for certificate %s", c.certificateName)
-		err = m.keyvault.WaitForCertificateOperation(ctx, c.certificateName)
+		err = m.env.ClustersKeyvault().WaitForCertificateOperation(ctx, c.certificateName)
 		if err != nil {
 			return err
 		}
@@ -69,7 +69,7 @@ func (m *manager) createCertificates(ctx context.Context) error {
 }
 
 func (m *manager) ensureSecret(ctx context.Context, secrets coreclient.SecretInterface, certificateName string) error {
-	bundle, err := m.keyvault.GetSecret(ctx, certificateName)
+	bundle, err := m.env.ClustersKeyvault().GetSecret(ctx, certificateName)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/database/database.go b/pkg/database/database.go
index 44df27c57..ed993a95b 100644
--- a/pkg/database/database.go
+++ b/pkg/database/database.go
@@ -84,6 +84,14 @@ func databaseName(deploymentMode deployment.Mode) (string, error) {
 }
 
 func find(ctx context.Context, env env.Core) (string, string, error) {
+	for _, key := range []string{
+		"DATABASE_ACCOUNT_NAME",
+	} {
+		if _, found := os.LookupEnv(key); !found {
+			return "", "", fmt.Errorf("environment variable %q unset", key)
+		}
+	}
+
 	rpAuthorizer, err := env.NewRPAuthorizer(env.Environment().ResourceManagerEndpoint)
 	if err != nil {
 		return "", "", err
@@ -92,18 +100,6 @@ func find(ctx context.Context, env env.Core) (string, string, error) {
 	databaseaccounts := documentdb.NewDatabaseAccountsClient(env.SubscriptionID(), rpAuthorizer)
 
 	acctName := os.Getenv("DATABASE_ACCOUNT_NAME")
-	if acctName == "" {
-		accts, err := databaseaccounts.ListByResourceGroup(ctx, env.ResourceGroup())
-		if err != nil {
-			return "", "", err
-		}
-
-		if len(*accts.Value) != 1 {
-			return "", "", fmt.Errorf("found %d database accounts, expected 1", len(*accts.Value))
-		}
-
-		acctName = *(*accts.Value)[0].Name
-	}
 
 	keys, err := databaseaccounts.ListKeys(ctx, env.ResourceGroup(), acctName)
 	if err != nil {
diff --git a/pkg/deploy/bindata.go b/pkg/deploy/bindata.go
index c84a018db..21f6d9d3d 100644
--- a/pkg/deploy/bindata.go
+++ b/pkg/deploy/bindata.go
@@ -171,7 +171,7 @@ func rbacDevelopmentJson() (*asset, error) {
 	return a, nil
 }
 
-var _rpDevelopmentPredeployJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x5b\x6f\xdb\x3c\x0c\x7d\xcf\xaf\x30\xf4\x7d\x40\x92\x21\x71\xec\xac\xdd\xb0\xbc\x15\x18\x30\x14\xbb\x05\x6d\xd1\x97\x20\x28\x14\x99\x49\xd4\xca\x92\x20\xd1\x6d\xb3\xa1\xff\x7d\x90\x9d\xbb\xed\x5c\xda\x6c\xe8\xba\xba\x0f\x0d\x4c\xf2\x50\xa4\xa8\x73\xe4\x9f\x15\xcf\xf3\x3c\xf2\xbf\x65\x63\x88\x29\xe9\x78\x64\x8c\xa8\x6d\xa7\xd5\xca\xde\xf8\x31\x95\x74\x04\x31\x48\xf4\xe9\x8f\xc4\x80\xcf\x54\x3c\xb5\xd9\x56\x3b\x08\x8f\x9b\x41\xd8\x0c\xc2\x56\x04\x5a\xa8\x89\xf3\xbb\x80\x58\x0b\x8a\xe0\x5f\x5b\x25\xff\x23\x8d\x2c\x03\x53\x12\x41\xe2\x25\x18\xcb\x95\x74\x89\x42\x3f\x70\x7f\x33\x07\x4d\x0d\x8d\x01\xc1\x58\xd2\xf1\xb2\x65\xa5\xef\x69\x14\x73\xf9\x7d\x70\x0d\x0c\x4f\xa3\x15\x53\x6a\xc6\x89\x06\x87\x66\xd1\x70\x39\x22\x73\xe3\x43\x63\x01\x31\xd4\xe7\x60\x6e\x39\x83\xae\xe1\x92\x71\x4d\xc5\x63\x91\x6e\x60\x72\x4b\x13\x81\x5d\x03\x43\x7e\xbf\x15\xa3\xb1\x6a\x8d\xe9\xfd\x17\x90\x23\x1c\x93\x8e\xd7\x0e\x0a\x13\x98\xa7\x2d\xb5\xb2\x84\x47\x0c\x58\x95\x18\x06\xae\xa1\xbd\xb9\xcf\x1a\x94\x36\x4a\x83\x41\x0e\x36\x97\x26\xb5\x5b\x60\x89\xe1\x38\x39\x4b\xc4\x1a\xd0\xf2\x93\x0f\xdc\x35\xc1\xba\x2f\x2a\xa6\x84\xab\xed\x82\xe9\xb5\xfe\xe5\xd7\x96\x96\xd7\x55\x06\xcf\xa8\x1c\xa5\x1d\x79\xb3\x2d\x26\x02\x8b\x5c\x52\xe4\x4a\xae\x04\x1e\x1d\xbd\xdd\x2d\xdd\x49\x14\x19\xb0\x76\x3e\x01\x7b\xa5\xdc\x3f\x98\x32\x06\xd6\xb5\x8e\x9c\x08\xa1\xee\xb6\xb9\x6b\xc3\x95\xdb\x2e\xd2\xf1\xc2\x76\xb0\x6d\x61\xdc\x00\xc3\xe9\x71\x3c\x95\x03\x95\xc8\x88\x94\x86\x3c\x94\xa3\x11\x49\xe3\xb4\x8b\x46\x5f\x71\x79\x45\x4d\x5c\x0c\x53\x02\xf1\xf7\x4f\x4f\xbb\xfd\xe2\x86\xe7\xf8\x8f\x0f\x8f\xb5\xe3\x2b\x2e\x4b\x26\x27\xf7\xb6\x5f\xd9\x80\xbf\x34\x90\x4d\x69\x73\x44\x3c\xe3\xcf\xaf\x9c\x19\x65\xd5\x10\xfd\x6f\x80\x77\xca\xdc\xb4\x64\xf6\xff\x7c\xca\x7a\x9f\x8c\x4a\xb4\x5d\x0f\x17\x8a\xd1\x59\xe5\xbd\x19\xcb\xa6\xae\xb5\xba\x3f\x33\xf6\xd7\xa3\xa8\xe6\x4b\xea\xd7\x0e\xc2\x0f\xcd\xe0\x7d\x33\x08\x0b\x95\x66\x23\x4b\x6f\x28\x56\xc3\x0b\xac\x37\xaf\x4a\x08\x92\xca\xec\x3e\x40\x7a\x36\x19\x58\x66\xb8\x76\xab\xa8\xd5\xfd\x99\x6d\x7d\x41\x69\xa0\xbd\x49\x4a\x89\x84\x0c\x69\xcc\xc5\x24\x3d\x2e\x25\x47\x65\x31\xab\x48\x65\x44\x4d\xc1\xc4\x17\x4c\xfa\xf4\x1c\x76\x95\xe0\x8c\x3f\x4e\x45\x1f\x5b\xf0\x1c\x40\x2d\x6e\x50\xa4\xb7\xb8\x6b\xd5\xaa\x45\x97\xa3\x6a\x7d\x23\x96\x06\x13\x73\xeb\x76\x76\x07\x56\xb6\xc0\x0c\x60\x79\xd1\x2b\xce\x23\xc0\x72\x0e\x71\x4f\x7f\x0b\x2b\x31\x37\x35\x43\xce\x28\x6e\xe8\xf3\x6a\x84\x01\x8a\xb0\x85\x1a\xbd\x8c\x8a\x05\xec\xe6\xe9\xca\xd8\xc1\x2d\xd1\x91\x4b\xbd\xb9\xe0\x72\x4a\x3d\x90\xc4\xfe\xbe\xd1\x5a\xb9\xba\x1f\x72\xa6\xf6\xdf\xe5\x1d\x77\x44\x70\xbb\x6d\x00\xf7\xdd\x8f\xbc\x70\x15\x10\x04\x48\x3a\x10\x70\xae\x86\xf8\x31\x1b\xb2\x8e\x87\x26\x81\x9d\x24\xae\xc7\x94\x64\x14\x6b\xcb\x9d\x5f\xfd\x4e\xa9\xd6\x1b\x5e\xb5\xc9\x84\xcd\xef\x41\x81\x34\x7c\x86\xc9\xa5\x8b\x6d\xa5\x08\x07\x12\x03\xa4\xa3\x12\x2a\x4f\xb3\x38\x30\x26\x12\x9b\x7e\xfe\x6d\xac\x3a\xa7\x2a\xef\x9a\x61\xf0\xaa\x2a\xcf\x4d\x55\x8a\xbe\x63\x9f\xb1\xaa\xbc\x92\x6c\xde\x79\xaf\x16\xdb\x83\xf1\xeb\xc1\x05\xfe\xe0\xb2\xcd\x63\xad\xcc\x3f\x2f\x27\xf6\x96\x3d\x6b\x39\xb1\x19\xff\x3c\x59\x4d\xd2\x5f\xfd\xca\x43\xe5\x57\x00\x00\x00\xff\xff\x17\xb1\x89\xed\x2b\x15\x00\x00")
+var _rpDevelopmentPredeployJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x5b\x4f\xdb\x4a\x10\x7e\xcf\xaf\xb0\x7c\x8e\x94\xe4\x28\x71\xec\x1c\x68\xd5\xbc\x21\x55\xaa\x50\x6f\x11\x20\x5e\x22\x84\x36\xeb\x49\xb2\x60\xef\xae\x66\xc7\x40\x5a\xf1\xdf\xab\xb5\x73\xb7\x9d\x0b\x0d\x15\xd0\x84\x07\x24\xcf\xcc\x37\x3b\xb3\x9f\xbf\x19\xff\xac\x38\x8e\xe3\xb8\xff\x1a\x3e\x82\x98\xb9\x1d\xc7\x1d\x11\x69\xd3\x69\xb5\xb2\x27\x5e\xcc\x24\x1b\x42\x0c\x92\x3c\xf6\x23\x41\xf0\xb8\x8a\x27\x36\xd3\x6a\xfb\xc1\x71\xd3\x0f\x9a\x7e\xd0\x0a\x41\x47\x6a\x6c\xfd\x2e\x20\xd6\x11\x23\xf0\x6e\x8c\x92\xff\xb8\x8d\x2c\x03\x57\x92\x40\xd2\x25\xa0\x11\x4a\xda\x44\x81\xe7\xdb\xbf\xa9\x83\x66\xc8\x62\x20\x40\xe3\x76\x9c\xec\x58\xe9\x73\x16\xc6\x42\x7e\xef\xdf\x00\xa7\xd3\x70\xc9\x94\x9a\x69\xac\xc1\xa2\x19\x42\x21\x87\xee\xcc\xf8\xd8\x98\x43\x0c\xf4\x39\xe0\x9d\xe0\xd0\x45\x21\xb9\xd0\x2c\x7a\x2a\xd2\x2d\x8c\xef\x58\x12\x51\x17\x61\x20\x1e\x36\x62\x34\x96\xad\x31\x7b\xf8\x02\x72\x48\x23\xb7\xe3\xb4\xfd\xc2\x04\xf8\x7b\x47\xad\x2c\xe0\xb9\x08\x46\x25\xc8\xc1\x36\xb4\x37\xf3\x59\x81\xd2\xa8\x34\x20\x09\x30\xb9\x34\xa9\xdd\x00\x4f\x50\xd0\xf8\x2c\x89\x56\x80\x16\x7f\xf9\xc0\x6d\x13\xac\xfa\x92\xe2\x2a\xb2\xb5\x5d\x70\xbd\xd2\xbf\xfc\xd9\xd2\xf2\xba\x0a\xe9\x8c\xc9\x61\xda\x91\xff\x36\xc5\x84\x60\x48\x48\x46\x42\xc9\xa5\xc0\xa3\xa3\xff\xb7\x4b\x77\x12\x86\x08\xc6\xcc\x18\xb0\x53\xca\xdd\x83\x19\xe7\x60\x6c\xeb\xdc\x93\x28\x52\xf7\x9b\xdc\x35\x0a\x65\xaf\xcb\xed\x38\x41\xdb\xdf\x74\x30\x81\xc0\x69\xf2\x3a\x9e\xca\xbe\x4a\x64\xe8\x96\x86\x3c\x96\xa3\xb9\x92\xc5\x69\x17\x51\x5f\x0b\x79\xcd\x30\x2e\x86\x29\x81\x78\xfd\xec\x69\xb7\xdf\x1c\x79\x8e\xff\x38\x79\x8c\x19\x5d\x0b\x59\xc2\x9c\xdc\xd3\xab\xca\x1a\xfc\x05\x42\x36\xa5\xc9\x09\xf1\x54\x3f\xbf\x0a\x8e\xca\xa8\x01\x79\xdf\x80\xee\x15\xde\xb6\x64\xf6\xff\x7c\xa2\x7a\x9f\x50\x25\xda\xac\x86\x47\x8a\xb3\x69\xe5\xbd\xa9\xca\xa6\xae\xb5\xba\x37\x35\x5e\xad\x46\x31\x2d\x16\xa6\x5f\xdb\x0f\x3e\x34\xfd\xf7\x4d\x3f\x28\x9c\x34\x6b\x55\x7a\x4d\xb1\x1a\xde\x60\xbd\xf9\xa9\x44\x20\x99\xcc\xf6\x01\xb7\x67\x92\xbe\xe1\x28\xb4\x3d\x45\xad\xee\x4d\x6d\xab\x07\x4a\x03\xcd\x6d\x52\x2a\x24\xee\x80\xc5\x22\x1a\xa7\xaf\x4b\xc9\xab\x32\xe7\x2a\x31\x19\x32\x2c\x60\x7c\x01\xd3\x27\xef\x61\x57\x45\x82\x8b\xa7\x4d\xd1\xa7\x16\x3c\x03\x50\xf3\x0d\xca\xed\xcd\x77\xad\x5a\xb5\x68\x39\xaa\xd6\xd7\x62\x69\xc0\x58\x18\x7b\xb3\x5b\xa8\xb2\x01\x8e\x40\xe5\x45\x2f\x39\x0f\x81\xca\x35\xc4\xfe\xae\x36\xa8\x12\xb7\xac\x19\x08\xce\x68\x4d\x9f\x97\x23\x10\x18\xc1\x06\x69\x74\x32\x29\x8e\x60\x3b\x4f\x5b\xc6\x16\x6e\x89\x0e\x6d\xea\xf5\x05\x97\x4b\xea\x9e\x46\xec\xf3\x51\xab\x68\x99\x3d\x50\xab\xc8\xf3\x40\xad\x62\x80\x52\x6a\x2d\x7d\x15\xee\x93\x53\xbb\xdf\xf2\x96\x37\x12\x09\xb3\x89\x80\xbb\xde\x47\x7e\x27\x2a\x98\x3d\x20\x59\x3f\x82\x73\x35\xa0\x8f\x19\xc9\x3a\x0e\x61\x02\x5b\x6d\x4f\x3d\xae\x24\x67\x54\x5b\xec\xfc\xf2\x27\x70\xb5\xde\x70\xaa\x4d\x1e\x99\xfc\x1d\x14\x6c\x1d\x9f\x61\x7c\x69\x63\x5b\x29\xc2\x73\xed\x19\xef\x9a\x81\x7f\xd8\x33\x5e\xda\x9e\xf1\xca\x86\xc1\x41\x1b\xf3\xce\x3b\xb5\xd8\xec\x4d\x16\xf7\x3e\x97\xf7\x3e\x6d\x45\xac\x15\xfe\xf5\x53\xc0\xdc\xf1\x17\x3d\x05\x2a\x59\x7b\x1f\x2b\xbf\x02\x00\x00\xff\xff\x58\x42\xc8\xe8\xf5\x16\x00\x00")
 
 func rpDevelopmentPredeployJsonBytes() ([]byte, error) {
 	return bindataRead(
@@ -291,7 +291,7 @@ func rpProductionManagedIdentityJson() (*asset, error) {
 	return a, nil
 }
 
-var _rpProductionParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x94\x41\x8b\x13\x41\x10\x85\xef\xf9\x15\xc3\xe8\x71\x77\x92\xac\x78\xc9\x6d\x77\xa2\x12\x44\x09\x06\xbd\x2e\x95\xee\x4a\xd2\xd2\x55\xd5\x54\x75\x0f\xba\xb2\xff\x5d\x26\x71\x57\x05\xb3\x38\xa3\x0c\xcc\xa1\xaa\xde\xf7\x06\xde\x63\xbe\x4d\xaa\xaa\xaa\xea\xe7\xe6\x0e\x48\x50\x2f\xaa\xfa\x90\x73\xb2\xc5\x74\x7a\x9a\x34\x04\x0c\x7b\x24\xe4\xdc\xc0\x5d\x51\x6c\x9c\xd0\x8f\x9d\x4d\xaf\x66\xf3\x97\x97\xb3\xf9\xe5\x6c\x3e\xf5\x98\xa2\x7c\xed\xef\xd6\xa0\x40\x98\x51\xad\xf9\x6c\xc2\xcf\xea\x8b\x93\x87\x13\xce\xc8\xf9\x13\xaa\x05\xe1\xde\x6a\xde\xcc\xfa\xe7\xe1\x20\x3d\x0a\xeb\x45\x75\xfa\xb0\xe3\x1c\x9c\x7e\x40\x93\xa2\x0e\x57\xfe\xb7\xd5\x71\xdd\x41\x2c\xd8\xe3\xea\xc7\xf9\xfd\xc5\x2f\x6a\x4f\x81\xaf\x53\x68\xe1\xa6\xb0\x8f\x38\x1e\x10\x03\x72\x6e\x51\x73\x2b\x44\xc2\xef\x81\x86\xc3\x3c\x64\xd8\x82\xe1\xb5\x73\x52\x38\x8f\x63\x08\x41\x18\x67\x8f\x5f\xb2\x42\x2b\x46\x62\xcb\x9b\xd5\xda\x06\x03\x76\x69\x83\xda\x05\x87\x6b\x0d\xec\x42\x82\x38\x22\x92\x5d\x89\x71\x79\xec\xcb\x79\xe9\x0e\xa2\xe1\x1f\xd5\xe4\xe9\xb5\x1e\xbb\xe4\x3f\x6a\x1c\x6c\x4e\xde\x7c\x2b\xbc\x0b\xfb\x9f\x4d\x1c\x4e\x78\xc5\x5d\x50\xe1\xbe\xef\x83\xf5\x9a\x56\x04\xfb\xe1\xe1\x69\x7a\x27\x7e\x8c\xec\x3f\x44\x66\x76\x58\x97\x6d\x0c\xee\x2d\x3e\x11\xda\x39\x71\x16\x85\xfd\x3f\x75\xde\xca\xd6\x9c\x86\x94\x83\xf0\xc3\xcf\xe0\x8d\x4a\x49\xa3\x68\x1d\x6d\xc2\xdd\x53\xb2\x4d\x06\xf6\xa0\xfe\x76\x79\x65\xb7\xdd\x8b\x73\x14\xb3\xbf\xb7\x9f\x9c\xde\xf7\x93\xef\x01\x00\x00\xff\xff\x89\xe8\x35\x73\x73\x05\x00\x00")
+var _rpProductionParametersJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x94\xc1\x6e\xd3\x40\x10\x86\xef\x79\x0a\xcb\x70\x6c\x9d\xa4\x88\x4b\x6e\xad\x03\x28\x42\x20\x8b\x08\xae\xd5\x64\x77\x9c\x2c\xec\xce\xac\x66\x76\xad\xb6\xa8\xef\x8e\x1c\xd3\x02\x12\xa9\xb0\xa9\x2c\xf9\x30\xb3\xdf\xf7\x5b\x9a\x59\x7f\x9f\x15\x45\x51\x94\x2f\xd5\x1c\x30\x40\xb9\x2a\xca\x43\x4a\x51\x57\xf3\xf9\x50\xa9\x02\x10\xec\x31\x20\xa5\x0a\xee\xb2\x60\x65\x38\xfc\xec\xe9\xfc\x62\xb1\x7c\x7d\xbe\x58\x9e\x2f\x96\x73\x8b\xd1\xf3\x6d\x7f\xae\x01\x81\x80\x09\x45\xab\xaf\xca\xf4\xa2\x3c\x1b\x32\x0c\x53\x42\x4a\x5f\x50\xd4\x31\xf5\x51\xcb\x6a\xd1\x3f\x0f\x07\xe2\x23\x58\xae\x8a\xe1\xc3\x8e\x75\x30\xf2\x09\x95\xb3\x18\xdc\xd8\x3f\x5a\xc7\x76\x07\x3e\x63\xaf\x2b\x1f\xeb\xf7\x67\xbf\xd1\x36\x38\xba\x8c\xae\x86\xab\x4c\xd6\xe3\x74\x81\x77\x48\xa9\x46\x49\x35\x87\xc0\xf4\x11\xc2\x78\x99\x85\x04\x3b\x50\xbc\x34\x86\x33\xa5\x69\x0e\x0e\xe0\xa6\xc5\xe3\x4d\x12\xa8\x59\x03\xeb\xfa\x6a\xd3\xe8\x68\x41\x1b\xb7\x28\x9d\x33\xd8\x88\x23\xe3\x22\xf8\x09\x23\x69\xb3\xf7\xeb\xe3\xbe\x9c\x46\x5b\xf0\x8a\x7f\xa5\xbf\xe1\x6d\x07\xd9\xa7\x46\xb0\x75\x37\xa3\xc3\x83\x0d\x6f\xe5\xb8\x8a\xf6\xb3\xf8\x09\xb8\xda\x9a\xa9\x75\xfb\x5f\x8b\x3c\xde\xf0\x86\x3a\x27\x4c\xfd\x75\x19\xcd\x4b\xdc\x04\xd8\x8f\x9f\xbd\xc4\x0f\x6c\xa7\x60\xcf\x30\x71\xd5\x43\x93\x77\xde\x99\xf7\xf8\xc4\xcc\x4f\xc1\x89\x05\xf6\xff\x75\x65\x34\xef\xd4\x88\x8b\xc9\x31\x3d\xfc\x4b\xde\x09\xe7\x38\xc9\xd6\x85\xad\xbb\x7b\x0a\xdb\x26\x20\x0b\x62\xaf\xd7\x17\x7a\xdd\xbd\x3a\x65\x51\xfd\xf7\xf8\xd9\xf0\xbe\x9f\xfd\x08\x00\x00\xff\xff\xbe\x95\xac\x03\xb2\x05\x00\x00")
 
 func rpProductionParametersJsonBytes() ([]byte, error) {
 	return bindataRead(
@@ -331,7 +331,7 @@ func rpProductionPredeployParametersJson() (*asset, error) {
 	return a, nil
 }
 
-var _rpProductionPredeployJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x51\x6f\xdb\x36\x10\x7e\xcf\xaf\x10\xb4\x01\xb6\x87\xda\x96\xd3\x6e\xc3\xfc\x16\xac\x40\x11\x74\x0d\x82\xb8\xc8\x8b\x11\x14\x34\x75\x76\xd8\x50\x24\x71\x3c\xb9\xf1\x8a\xfc\xf7\x81\x94\xec\x58\x16\x25\xb9\x43\xbb\x04\x58\x92\x07\x4b\xe2\xdd\x7d\x77\xc7\xef\x8e\xc7\xaf\x27\x51\x14\x45\xf1\xcf\x96\xdf\x42\xc6\xe2\x69\x14\xdf\x12\x19\x3b\x1d\x8f\x8b\x2f\xa3\x8c\x29\xb6\x82\x0c\x14\x8d\xd8\xdf\x39\xc2\x88\xeb\xac\x5c\xb3\xe3\xd3\x64\xf2\xeb\x30\x99\x0c\x93\xc9\x38\x05\x23\xf5\xc6\xc9\x7d\x84\xcc\x48\x46\x30\xfa\x6c\xb5\xfa\x29\x7e\x55\x20\x70\xad\x08\x14\x5d\x03\x5a\xa1\x95\x03\x9a\x8c\x12\xf7\xbf\x15\x58\x33\x14\x6c\x21\xc1\xc6\xd3\xa8\xf0\xaa\xd0\x93\xb9\x25\xc0\xf7\xb0\x59\xb3\x5c\xd2\x19\xe7\x60\xed\xa5\x96\x82\x0b\x2f\x3a\xdf\x89\xba\xbf\xaf\x95\x37\x6f\x80\x40\x31\x45\xe7\xa9\x83\x9c\xdb\x7c\x61\x39\x0a\x43\x42\xab\xfe\x60\xb4\x5d\xbb\x29\x9d\xa8\x28\xea\xc5\x67\xe0\x5b\x45\xc3\x90\x65\x40\x80\xb6\xdf\x5b\x9a\x19\xe0\x5a\x70\xb8\x44\xa1\xb8\x30\x4c\x9e\xa7\xbd\x41\xd0\x86\x01\xcc\x84\x75\x11\x57\xc3\xaa\x08\x59\xe0\x08\x54\x0f\xa6\x22\xb4\x02\x8a\x83\xab\x37\x75\xd8\x22\x71\x80\x24\x96\x82\x33\x0a\xe4\xa9\x2a\x89\xc0\x08\x02\xee\xef\x24\x52\x90\xd0\x2e\xe1\xdc\x6b\x59\xce\x4d\xea\x20\xc2\x01\xd4\xbe\x3e\x9c\x84\xdf\xf6\x42\x8d\x6d\xb1\x05\xcf\x89\x17\xf8\xbc\x78\x71\x7c\x5a\xfd\xd3\x43\x59\x87\x8f\x11\x55\x0b\xb1\x28\xf0\x8b\xd9\xbb\xba\xc7\x31\x6d\x0c\xb8\x74\x2c\xb4\x96\x07\xe1\xc6\x29\x2c\xdd\x06\x5d\x33\x99\x3b\x99\x25\x93\x16\x76\x12\x0f\x7b\x3b\x0a\xf7\x84\xec\xcf\x8e\x72\x6f\x00\x66\x88\x6c\xd3\x81\x3c\xbf\x69\x86\x9d\x75\xb0\xe9\xfb\xc3\x86\x9a\x48\x33\x90\x25\x14\x6a\x15\x87\x2d\xe5\x52\xbe\xf5\x9b\xf3\x83\x36\xe6\xae\xcc\xca\x25\xc2\x52\xdc\x77\x3a\x79\x00\x93\xb1\xfb\xbf\x40\xad\xe8\x36\x9e\x46\xa7\x49\x10\x00\xcd\x85\x5d\xcd\x74\x8e\x1c\xce\xd2\x14\x5d\xea\x3d\xd4\x0f\x4a\x7d\xa8\x4e\xbf\x21\xf5\x95\x6a\x41\xb0\xde\xef\x6a\x95\x1e\x98\x32\xa8\x8d\xeb\xc6\x81\x78\xa2\xb2\xd0\x73\x14\xb4\xb9\xca\x65\x4b\xaf\x0e\x77\x89\x63\x00\x0e\x65\x49\x73\x2d\x5d\x6c\x1f\xb9\x69\xe9\xda\x85\x6f\x3e\xbc\x4b\x8d\x74\xc5\xd4\xca\x67\xe4\x97\x2e\x9d\x14\x2c\x09\xc5\x5c\x33\xad\x28\xbe\x79\xf3\xfa\x38\xb8\x0a\x0b\x9c\xe6\x99\x1b\x3d\xae\xca\x5c\x7f\xf0\x23\x09\x7e\x83\x17\x35\x7b\x9d\x21\x30\xdf\x01\x3c\xb4\x94\xfa\x4b\x97\xb8\x41\xa1\xdd\x0e\xc6\xd3\x68\x72\x9a\x74\x39\x26\x10\x38\x95\x53\xd0\xb9\x5a\xe8\x5c\xa5\xe1\x1e\x1e\x55\x99\x5b\xb3\xa4\x58\xe6\x13\x8b\xe6\x93\x50\x9f\x18\x66\x61\x33\x0d\x26\xfe\xaf\x84\xf2\x41\x1d\x1e\xdd\x4d\x1d\x28\x7c\x80\x37\x79\xf7\x9f\x12\xed\xf5\x53\x11\x6d\x05\x0a\xd6\xac\x81\x6b\xb5\xaf\xd5\x41\xe4\x00\x65\xcf\xf2\x50\xd9\xda\xe1\xb1\x6d\xc2\x1f\x04\x47\x6d\xf5\x92\x46\x17\x40\x5f\x34\xde\x8d\x55\xf1\x3b\x2b\x5b\xe7\x3b\xd4\xb9\xb1\x87\xea\x52\x73\xb6\x8d\x7f\xbe\x6d\xd5\x5e\xb4\x3f\x18\x6d\x17\x0f\xf7\xd7\x5d\x55\x52\xb1\x53\xdb\xa7\xc9\xe3\x0c\x54\xa7\x45\xcc\x8c\xd8\xbb\xdd\x9c\x26\x93\x3f\x86\xc9\xef\xc3\x64\x12\x3c\xb5\x5b\x4f\x88\x96\x1c\x19\x78\x49\x53\xf3\x41\xfa\xaf\x67\x7a\x7b\x97\x37\xcf\xe1\x4b\x96\x09\xb9\xf1\x25\xda\x50\x9e\xbb\x1d\xb2\xc4\x54\xca\x30\x50\x65\x81\xea\x2a\x6b\x7f\x6f\xcc\x8c\xe7\x5c\x2b\xce\xa8\xbf\xbb\x0c\xf7\x7b\xad\x17\xe0\xde\xe0\x55\xb4\x9f\xf9\xee\x19\xba\x37\x08\xdf\x48\x40\x39\xbc\x99\x5e\xd2\xdb\xe2\xb2\x37\x8d\x08\x73\x38\xaa\x76\xb7\x5e\xef\x7b\x52\x1d\x1a\x9d\x9f\xbd\x21\x97\x21\x42\xd4\xc9\xfb\x1e\x36\xd7\x4e\x77\xec\x2d\x7c\x27\xba\x12\x5b\x35\xb0\xc6\xa3\x38\x63\x65\xaa\x6d\xdc\x1a\x75\x33\xef\x1f\x27\xf1\x63\x78\xff\xdb\x70\x92\xbc\xf0\xbe\x91\xf7\xad\x17\xfc\x20\xef\x5b\x2f\x71\x4f\xc9\x7b\xbb\xe6\xcf\x9a\xf7\x65\xaa\x9f\x8a\xf6\xfe\xe9\xe6\xe4\xe1\xe4\x9f\x00\x00\x00\xff\xff\x0c\x6b\x9e\xa0\x8d\x14\x00\x00")
+var _rpProductionPredeployJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x6f\xdb\x36\x10\x7f\xcf\xa7\x10\xb8\x01\xb6\x87\xd8\x96\xd3\x6e\xc3\xfc\x16\xac\x40\x11\x74\x0d\x82\xb8\xc8\x8b\x61\x14\x34\x75\x76\xd8\x50\x24\x71\xa4\xdc\x78\x45\xbe\xfb\x40\x4a\x76\x24\x8b\x92\xdc\x61\x69\x83\x35\xc9\x83\x6d\xf1\x78\xbf\xfb\xf3\xbb\xe3\x51\x5f\x4e\xa2\x28\x8a\xc8\xcf\x86\xdd\x42\x4a\xc9\x34\x22\xb7\xd6\x6a\x33\x1d\x8f\xf3\x27\xa3\x94\x4a\xba\x86\x14\xa4\x1d\xd1\xbf\x33\x84\x11\x53\x69\xb1\x66\xc6\x67\xf1\xe4\xd7\x61\x3c\x19\xc6\x93\x71\x02\x5a\xa8\xad\x93\xfb\x00\xa9\x16\xd4\xc2\xe8\x93\x51\xf2\x27\x72\x9a\x23\x30\x25\x2d\x48\x7b\x03\x68\xb8\x92\x0e\x68\x32\x8a\xdd\xff\x4e\x60\x43\x91\xd3\xa5\x00\x43\xa6\x51\x6e\x55\xbe\x4f\x64\xc6\x02\xbe\x83\xed\x86\x66\xc2\x9e\x33\x06\xc6\x5c\x29\xc1\x19\xf7\xa2\xf3\xbd\xa8\xfb\xfb\x52\xf9\xe5\x15\x58\x90\x54\xda\x8b\xc4\x41\xce\x4d\xb6\x34\x0c\xb9\xb6\x5c\xc9\xfe\x60\xb4\x5b\x5b\x14\x46\x54\x36\xaa\xe5\x27\x60\xbb\x8d\x9a\x22\x4d\xc1\x02\x9a\x7e\x6f\xa5\x67\x80\x1b\xce\xe0\x0a\xb9\x64\x5c\x53\x71\x91\xf4\x06\x41\x1d\x1a\x30\xe5\xc6\x79\x5c\x75\xab\x22\x64\x80\x21\xd8\xba\x33\x15\xa1\x35\x58\x12\x5c\x5d\xd4\x61\xf3\xc0\x01\x5a\xbe\xe2\x8c\xda\x40\x9c\xaa\x92\x08\xd4\x42\xc0\xfc\xbd\x44\x02\x02\xda\x25\x9c\x79\x2d\xcb\x99\x4e\x1c\x44\xd8\x81\xda\xd3\x87\xca\x93\x87\xd3\x6f\x9f\x62\x7c\x49\x71\xd0\xbc\xa7\x4a\xf1\xfe\x57\xc9\x55\x62\xf2\x14\x3c\xa7\xd2\x7f\x66\xbc\x38\x3e\xac\xfe\x5b\x51\x49\xe4\xd1\xa3\x6a\xaf\xcd\x7b\xf8\xe5\xec\x6d\xdd\x62\x62\xb7\x1a\x5c\x38\x96\x4a\x89\x03\x77\x49\x02\x2b\x97\xa0\x1b\x2a\x32\x27\xb3\xa2\xc2\xc0\x5e\xa2\x54\xbe\x04\xee\x2d\xd2\x3f\x3b\x3a\x7a\x03\x30\x45\xa4\xdb\x0e\xe4\xf9\xa2\x19\x76\xd6\xc1\xa6\xff\x1e\x36\x74\x4e\x34\x03\x19\x8b\x5c\xae\x49\x58\x53\x26\xc4\x1b\x9f\x9c\x27\x4a\xcc\x5d\x11\x95\x2b\x84\x15\xbf\xef\x34\xf2\x00\x26\xa5\xf7\x7f\x81\x5c\xdb\x5b\x32\x8d\xce\xe2\x20\x00\xea\x4b\xb3\x9e\xa9\x0c\x19\x9c\x27\x09\xba\xd0\x7b\xa8\x27\x0a\x7d\xa8\x4e\xbf\x22\xf4\x95\x6a\x41\x30\xde\xee\x6a\x95\x1e\xa8\xd2\xa8\xb4\xeb\xc6\x01\x7f\xa2\xa2\xd0\x33\xe4\x76\x7b\x9d\x89\x96\x5e\x1d\xee\x12\xc7\x00\x1c\xca\x5a\xc5\x94\x70\xbe\x7d\x60\xba\xa5\x6b\xe7\xb6\x79\xf7\xae\x14\xda\x6b\x2a\xd7\x3e\x22\xbf\x74\xed\x49\xc0\x58\x2e\xa9\x6b\xa6\x95\x8d\xaf\x5f\xbf\x3a\x0e\xae\xc2\x02\xb7\xf3\xdc\x4d\x97\xd7\x45\xac\xdf\xfb\xa9\x13\xbf\xc2\x8a\x9a\xbe\x4e\x17\xa8\xef\x00\x1e\x5a\x08\xf5\xb9\x4b\x5c\x23\x57\x2e\x83\x64\x1a\x4d\xce\xe2\x2e\xc3\x38\x02\xb3\xc5\xa0\x7b\x21\x97\x2a\x93\x49\xb8\x87\x47\xf5\x09\xa7\xa2\x49\xd2\xd4\x07\x16\xf5\x47\x2e\x3f\x52\x4c\xc3\x6a\x1a\x54\xfc\xa8\x84\xf2\x4e\x1d\x1e\xdd\x4d\x1d\x28\x7c\x80\x37\x59\xf7\x4d\x89\xf6\xea\x7b\x11\x6d\x0d\x12\x36\xb4\x81\x6b\xb5\xa7\x8b\xb6\x81\xbd\xa4\x79\x28\x4d\xed\xf0\xd8\x35\xe1\xf7\x9c\xa1\x32\x6a\x65\x47\x97\x60\x3f\x2b\xbc\x1b\xcb\xfc\x73\x56\xb4\xce\xb7\xa8\x32\x6d\x0e\xb7\x0b\xc5\xe8\xce\xff\xf9\xae\x55\x7b\xd1\xfe\x60\xb4\x5b\x3c\xcc\xaf\xbb\x8d\x26\x7c\xbf\xad\x4c\x93\xc7\x19\xa8\x4e\x0b\x42\x35\x2f\x5d\x60\xcf\xe2\xc9\x1f\xc3\xf8\xf7\x61\x3c\x09\x9e\xda\xad\x27\x44\x4b\x8c\x34\xbc\x84\xa9\xf9\x20\xfd\xd7\x33\xbd\xb9\xcb\x9a\xe7\xf0\x15\x4d\xb9\xd8\xfa\x12\x6d\x28\xcf\x7d\x86\x8c\xa5\x32\xa1\x18\xa8\xb2\x40\x75\x15\xb5\x5f\x1a\x33\xc9\x9c\x29\xc9\xa8\xed\xef\xdf\x77\xf4\x7b\xad\xef\x38\x7a\x83\xd3\xa8\x1c\xf9\xee\x19\xba\x37\x08\xdf\x48\x40\x3a\xbc\x99\x5a\xd9\x37\xf9\x65\x6f\x1a\x59\xcc\xe0\xa8\xda\xdd\x59\x5d\xb6\xa4\x3a\x34\x3a\x3b\x7b\x43\x26\x42\x84\xa8\x93\xf7\x1d\x6c\x6f\xdc\xde\xb1\xd7\xf0\xe4\x74\x7d\x1c\xa0\x8f\xa1\xeb\x6f\xc3\x49\xfc\x42\xd7\x46\xba\xb6\xde\xcb\x83\x74\x6d\xbd\x7b\x7d\x4f\xba\x9a\x0d\xfb\x3f\xd2\xd5\x7f\x5b\x9c\x3c\x9c\xfc\x13\x00\x00\xff\xff\x8b\x45\x21\x6b\xdf\x15\x00\x00")
 
 func rpProductionPredeployJsonBytes() ([]byte, error) {
 	return bindataRead(
@@ -371,7 +371,7 @@ func rpProductionSubscriptionJson() (*asset, error) {
 	return a, nil
 }
 
-var _rpProductionJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x73\xe2\xc8\xb2\xf6\xf7\xf3\x2b\x1c\x7e\x6f\x84\xa7\xdf\xdb\xb6\x25\x01\x6d\xeb\x44\x9c\x0f\x20\x90\x90\x00\x81\x76\xa1\x73\x4f\x4c\x68\x29\x84\x4c\x69\x19\x2d\x60\xb8\x31\xff\xfd\x46\x69\xc1\xec\xe0\xa5\x7b\x7a\x66\xcc\x44\xf4\x60\x54\x95\x95\x95\x95\xf9\x64\x66\x6d\xfa\xdf\x7f\x5c\x5d\x5d\x5d\x5d\xff\x57\x62\x4f\x81\x6f\x5e\xff\xf3\xea\x7a\x9a\xa6\x51\xf2\xcf\xfb\xfb\xe2\x97\x3b\xdf\x0c\x4c\x17\xf8\x20\x48\xef\xcc\x55\x16\x83\x3b\x3b\xf4\xcb\x67\xc9\x3d\x81\xe1\x8d\x5b\x0c\xbf\xc5\xf0\x7b\x07\x44\x30\x5c\xa2\x72\x32\xf0\x23\x68\xa6\xe0\xee\x29\x09\x83\xff\x77\xfd\xb5\x68\xc1\x0e\x83\x14\x04\xa9\x0a\xe2\xc4\x0b\x03\xd4\x10\x7e\x87\xa1\xff\xaa\x02\x91\x19\x9b\x3e\x48\x41\x9c\x5c\xff\xf3\xaa\x60\x2b\xff\xdd\xb4\x63\x11\x24\x61\x16\xdb\x80\x75\xb6\x1e\xe5\x8f\xd3\x65\x04\x10\xb5\x24\x8d\xbd\xc0\xbd\x5e\x3f\xfc\xfd\xeb\x06\x09\xc7\xf7\x82\x66\xe4\x51\x66\x2b\x0b\x1c\x08\xde\x49\x05\x7a\x20\x48\x29\x10\xa7\x54\xe8\xfb\x61\xc0\x9b\xfe\x1b\x29\x3a\x66\x6a\x5a\x66\x02\x9a\xb6\x1d\x66\x41\xfa\x0e\x42\xa1\x6f\x7a\xef\x60\x04\x3c\xa7\xb1\x49\x85\x89\x1f\x26\xed\x16\x3b\x4a\xce\x52\xf9\xba\xfd\xd4\x01\x13\x33\x83\xa9\x6a\xc2\x2c\x2f\x75\xb8\x95\x49\x24\x81\x78\xee\xd9\x60\x14\x7b\x81\xed\x45\x26\x7c\xeb\x80\x4e\x32\x08\xdb\xb9\xc2\x1d\xaf\x6f\x85\x21\x3c\xc3\xe7\xc4\x84\x09\x38\xd8\x80\xef\xf8\x74\x9c\x6b\xac\xa3\xc4\xf0\x6d\x4c\xfa\x4e\xe2\x50\x61\x30\xf1\xdc\x17\xa5\x7f\x23\x99\x4e\x30\xf7\xe2\x30\x40\xd6\xf5\x36\x22\x71\xc4\xfa\xa6\xfb\x46\xed\x88\xa3\x41\xe8\x9c\xaf\xfb\x26\x9d\x88\x3f\x4c\x27\x92\x64\x3a\xca\x2c\xe8\xd9\x3d\x70\x42\x2b\x4e\x52\x48\xc3\xd8\x74\xdf\x6f\x8d\x49\x66\x25\x76\xec\x45\xa9\x17\x06\x15\x74\x31\x71\x98\x45\x6f\x27\x39\xf7\x25\x6f\xf5\xee\x21\x90\x52\x33\x70\xcc\xd8\xf9\xb5\x4d\x24\xbf\xce\x6b\xc7\x9a\x4a\x92\x57\x32\xfa\x8f\x0d\x1a\xd7\x71\xd9\x63\x04\x22\xff\x5e\x97\xd9\x21\x95\xcc\xb2\x3d\xfa\xf9\x83\xa0\x68\x79\xcd\xea\xf5\x56\x91\xdf\x77\x3a\x18\xc5\x61\x04\xe2\xd4\x03\xfb\x88\x55\x3c\xcf\x15\x82\x1d\x35\x21\x0c\x6d\x13\x8d\xc7\x00\xa4\xd3\xd0\x29\x5b\x48\x3d\xfb\x34\xfd\x8a\x9b\x38\xba\x8d\xbc\x68\x57\xbc\x95\x3c\x06\x9e\x1d\x87\x49\x38\x49\xef\x78\x90\x2e\xc2\x78\x76\xbf\x6e\xd7\x71\x62\x90\x24\x20\xd9\xad\x5a\xb1\x83\xaa\xff\x3b\xde\xd4\x91\x5f\xbe\xdc\x55\x0f\xff\xb3\x5b\xcb\x0e\x03\xc7\x5b\x57\x7b\x71\x98\xbf\xdc\xbc\x00\xe2\xcd\x97\xbd\x6a\x66\xe4\x6d\xb8\x5d\x02\xc3\xc9\x5b\xec\xe1\x16\xc3\x0f\x8e\xff\x1f\x33\x50\x93\x12\x6c\xd9\x51\x81\x98\x59\x9c\x4b\x60\x5b\x87\x36\x3f\xfb\x34\x2e\x6d\x6b\xbb\xec\xf6\x40\x9d\xad\x90\x57\xf2\x9c\xad\x61\x63\x9d\x5f\x6e\x2e\x50\x81\x9b\xaf\x57\x37\x85\x1e\xed\x0f\xd1\xc1\x66\x52\xd3\x45\x0c\x05\x19\x84\x27\x0b\xff\x7e\xf4\xe9\xef\xc7\x5b\xd9\x54\xed\x4a\xf8\xd7\x07\x4b\xef\x93\xff\xcf\x3e\xd9\x6b\xcb\xb4\x67\x20\x70\xca\xde\x8e\xc2\x10\xbe\x69\xec\x36\xb8\x2a\x29\xbe\x87\x29\x18\x9a\x4e\xcb\x84\x66\x60\x7b\x81\x2b\x66\x10\x7c\x77\x7d\x3a\xa2\xc7\x1f\xa8\x57\x2f\x7d\x02\x71\x72\x7f\xcc\x6e\x4a\x65\x83\x56\xf9\xa5\x2a\x87\x54\xef\xb4\x32\x9d\x56\xcc\x03\xe3\xfc\xdd\xfa\x76\x40\xa5\x76\xbb\x55\x16\x79\x77\xaf\xa2\x38\xb4\xf6\x1d\xde\x47\x75\x24\xa7\xbe\xc7\x7b\xfe\xeb\x47\x70\x9e\x86\x76\x3e\x0a\xd7\xb2\xbd\xeb\xa2\xf6\x8a\x23\xc6\xda\x1e\x72\xe0\x56\x56\x39\x92\x76\x11\x25\x9c\xab\x5a\xa9\xd0\x28\x8c\x51\x10\x5a\xaf\xd7\x2e\x53\x95\x97\xf2\xef\xc5\x29\x68\xc5\x19\x04\xef\x01\x84\x62\x24\xbe\xbb\x53\xd9\x18\x93\x2e\xca\xa6\xcf\x89\x36\xba\x54\xa4\x41\xe6\x5b\x20\x1e\x4e\x46\x55\x3f\x88\x33\x15\x62\xf0\x5b\x06\x92\x74\x64\xa6\x53\xc4\xcd\xfd\x14\x98\x30\x9d\xae\xee\x63\x60\x3a\xcb\xe3\x9a\x77\xe1\x80\x14\x66\x73\xe9\x78\x5c\x1a\x69\x41\xeb\xf2\x40\x6b\xcb\xd0\x7e\xce\x20\x6b\x2f\x26\x8f\x40\xe0\x24\xc3\xe0\xa0\x16\xbe\x33\xaa\xf8\xc7\x61\x81\xbf\x23\xbc\xdb\x12\x40\x91\x85\x1c\x0e\x5f\xae\x53\x0f\xc4\x5b\x01\xe1\x81\x32\xb6\x19\x99\xb6\x97\xa2\xfc\xac\xf6\xae\x78\x31\x8b\xdc\xd8\x74\xc0\x28\x84\x9e\xbd\x9f\xed\xad\x8b\xf9\x45\xde\x7a\x3d\x30\x83\xcc\x84\xfb\x9a\x7a\x40\xcf\xaf\xe7\x5e\x9c\x66\x26\x1c\x98\xf6\xd4\x0b\xc0\x28\x0e\x27\xde\x81\x19\xa3\x75\xf1\x30\x39\x57\xa4\xe8\x79\xe8\x47\x59\x0a\x62\x94\x59\x8d\x62\x30\xf1\x9e\x73\xe9\xda\x61\x60\x9b\xe9\x2f\x68\x08\x6f\xbe\x5e\x6d\xcb\xba\x48\xc3\x6e\xbe\x7c\xbd\xba\xb9\x3d\x1d\x32\x16\x53\x53\x4a\x02\xe2\x6a\xd8\x6c\x18\x66\xce\x6d\x96\x80\xf8\x54\x35\xe8\x05\xd9\xf3\xeb\x02\x95\x6b\xc7\x4b\x4c\x0b\x82\x91\x99\x24\x8b\x30\x76\x9a\x59\x3a\x05\x41\xea\xad\x2d\x2d\x8d\x33\x70\x06\x94\x92\x64\x7a\x99\xaf\x8d\xaa\x7c\xfe\x38\x64\xef\x7e\xce\x53\x7d\xa1\xbe\x06\xc5\xd0\x07\xf7\x2f\x12\xbb\xbf\x4b\x92\xe9\xbd\x99\xa5\xd3\x30\xf6\x56\xc0\xf9\x75\x86\x18\x38\x1f\xb0\xaf\x09\xcf\xc0\xb2\x6d\xa6\xe6\x9e\xf9\x6c\xce\x50\x9c\x75\xfc\xd5\xe7\x78\x74\x5f\x7d\xfe\xf3\xd6\xec\xe0\x30\x70\x1f\xee\x68\x35\x39\x72\x91\xb2\x7b\xbe\xe9\x02\x11\x4c\x40\x0c\x02\xfb\x7c\x5c\x55\x8c\x73\x32\x2d\xf0\x43\x04\x4e\xd7\x3c\x1b\x8d\x84\x93\x49\x59\xbc\xdb\xe9\x9f\x2b\x5c\xa0\xdc\xf5\xc3\x6d\x5f\x1d\x9c\x2b\x3b\x7f\x01\xf1\x87\x3b\xf2\x8e\xc0\x08\x0c\xc7\x30\x1c\xff\xf6\x36\x6f\x19\x26\x6d\x2f\x99\x9d\x17\x81\x1d\x03\x33\x05\xc3\xa8\x72\x3c\x74\x1c\xfa\xc5\x94\xdd\x19\x7e\x8b\xf9\x79\xe7\xa2\x56\xae\xf6\x67\xb9\xe4\xd2\xb5\x8e\x62\xe0\x7b\x99\xff\x6b\x5f\x94\xce\x04\xa4\x1f\xa4\x4f\x41\xe1\xd1\x2e\xd2\xa7\x22\x6a\x19\x5d\x14\xa4\xff\xc8\x00\xfd\x64\x98\x54\xb4\xc4\x06\x29\x88\x27\xa6\x0d\x2e\x9c\xd7\xa8\x3e\x17\x0c\xe4\x46\xc8\x84\x9c\xc5\x6d\xe0\xd9\x97\x4c\x2b\xbc\x22\x92\xdd\xa8\xe3\xf9\x66\xbc\xbc\x08\xde\xd7\x95\xbc\xe8\x95\x7d\xde\xfc\x5c\x8e\xe3\x57\x87\x64\xe1\x45\x76\xde\xf6\x2b\x60\xfb\xea\x8d\xc2\xd9\xaa\x9f\x64\x56\x00\xf6\xe7\xe8\x2f\xae\x7f\x91\xf2\x96\x11\x4a\xf9\x67\x72\x5f\x34\x5a\xe9\xef\x3c\x00\x69\xf9\xb5\x78\x70\xb1\xab\xd9\xfc\x9c\xc9\x3b\x0f\x32\xff\x16\x2d\xd9\x26\xb0\x1d\xdd\xbe\x7e\x0a\xe5\x20\xd5\x5d\xdd\x88\xbc\xe8\xc7\xc8\x63\x13\x64\x5a\xaf\x98\x1f\x3b\xf7\x79\x9b\x1c\xae\xfe\xf8\x69\x98\x63\x9f\xf3\x31\xce\xee\xe7\x74\xcc\xf3\x76\xfa\x97\x95\x3c\xdf\xfa\x69\x3a\xc7\x9f\x1e\xa6\x7c\xcc\x87\x3a\x9e\xe9\x06\x61\x92\x7a\xf6\x65\x49\x88\x15\x86\x69\xfb\xa5\xce\x79\x5f\x0a\x02\x14\xeb\x3b\x17\x86\xf5\x45\x60\xa1\xc4\xde\x56\x6a\x53\xed\x27\xd8\xc9\x6f\xf6\x17\xdb\xf2\x4c\xe7\xce\x82\xa1\x75\x67\x87\x31\xb8\x5b\x78\x81\x13\x2e\x92\xbb\x00\xa4\xf7\xa7\xdd\xf0\xab\x84\x06\x9e\x53\x10\xa0\x10\xef\x22\x91\xad\x4b\x7f\x17\x97\x6d\x27\xe7\xe2\xbb\xab\x37\xbb\xec\xcd\x98\xfa\xc5\xc6\x9b\xf9\x1e\x8e\xce\x4b\xaf\x2e\x74\xe6\xd5\x14\x0c\x95\x25\x69\xe8\x4b\xf9\xf2\xe6\x6b\xea\x76\xcd\xc0\x81\x20\xde\x9c\x22\x59\x6f\xfd\x38\x4b\xc0\xcc\xd2\x50\x29\x32\xfe\x81\x17\x84\x1b\x54\x5e\x11\x8e\x24\x20\x4d\xbd\x20\x5f\x52\xf9\xdf\x0b\xd1\x3c\x9f\xc9\x03\x76\x0a\x1c\x69\xa3\xf2\xe5\x89\x60\xb1\x0a\x9c\x5b\x83\x65\x26\xe0\x5b\xfd\x97\xd2\x28\x8a\xbf\xe4\x50\xca\x57\x52\x7f\xb9\xb1\x09\x15\x63\x29\x1c\x82\x66\xd8\xbb\xf9\xf2\xf5\x66\xd0\x1e\xd0\xe2\x90\x97\x3b\x7c\x5b\x11\xfb\xff\xfa\xaf\xb2\xc2\xd5\xad\x73\xf5\x3f\x19\x86\xd5\xec\xcd\x7f\x6f\x6e\x6e\xbe\x96\xe4\x37\x0d\x6c\x7b\x0b\xc3\xcd\x97\x2f\x5f\x6f\x6e\x6e\xbe\xfc\x4f\x70\x83\xc8\x4b\x6d\x6a\xc8\xd3\x2c\xa3\x76\x44\x89\x1d\xf2\x6f\x6d\x61\x67\x83\xc3\x5e\x23\x1d\x5e\x65\xc5\x21\x3f\xe8\xf0\xf2\xdb\x9b\xd8\xd8\xfc\xb0\xd5\x40\x93\x12\xc5\x8e\x34\x54\x44\xaa\xc3\xb6\xdf\x46\x7e\x6b\x6f\xd1\x16\x71\x71\xc4\x0e\x9a\x4c\xe7\x6d\x64\xcb\xdd\x16\x3b\x04\x07\xc3\xf6\x9b\xe9\x0d\x42\x67\x9b\x5c\xb3\x3d\x60\xf9\xe6\x88\xa5\xfa\x6c\x87\x97\xa9\x8e\x28\x53\xc3\xc1\x60\xc8\xf3\xcd\xc1\x1b\x1b\x39\xb5\xbd\x69\xab\xe9\x76\x53\x6e\xb6\x9a\x52\xa7\x49\x51\x43\x85\x97\xdf\xde\xe2\x81\xed\x4f\x87\xfb\xd8\x6c\x29\x7c\xbb\xdf\xf9\x17\xa2\x73\x90\xe5\x72\x5f\xd7\x4d\x5e\xb9\xd4\xbe\x41\x31\x80\x37\x37\xf7\x2e\x08\xc0\xdc\xf4\x1d\xff\x9f\xbe\x99\xa4\x20\xfe\xb5\x81\x97\xa5\xfa\x43\xaa\x29\xbf\x4a\xff\x8f\x4d\x23\x6f\xb0\x2d\x29\x2d\x89\x12\xd9\x11\x22\xfc\x1a\xc5\xdc\xdc\x36\xf2\xcb\x97\xbb\xcd\x3f\x59\x67\x53\x93\x4a\xa5\x67\xc4\xa1\x32\x7a\x9d\xf4\x77\xb9\x47\xfe\x68\x83\x32\xfa\x67\x17\x9a\xa8\x00\xe2\x96\xd4\x4c\x81\xd4\xc2\x6d\x46\x9c\x3a\x8c\xe2\xf6\x75\xd7\x55\x31\x7a\x60\x6a\x0d\x1c\x74\xe8\xc0\xd0\x1a\x18\xe5\x46\x89\xe3\xab\x75\x87\x51\x33\x83\x6a\xa6\x16\xd5\x8c\x79\xb9\x09\x45\xc8\xd1\xa2\xd4\x9c\x1b\x8c\x4a\xf4\x6b\xdc\xdc\xaa\x89\x84\xb1\x24\x97\x16\x41\x62\x56\x77\xdc\x03\x8c\xb1\xd2\x09\x67\x69\xd5\x1c\xdf\x5e\x36\xe7\x87\xe8\x0c\xe4\xe6\x82\x53\x0c\x49\x54\x14\xb7\x4f\x88\xd0\xf1\x8a\xfa\x8e\x6f\xcf\x1d\x9f\x5e\x1e\xa2\x83\x7e\xa7\xdc\xf0\x89\x65\x68\xc2\x22\xe0\x8c\xa5\x38\x68\x07\xdc\xdc\x7e\x0a\x5d\x83\x61\x71\x96\x51\x97\xb6\x4f\x2e\x7b\x14\xb6\x1a\xb4\x67\xc4\x50\x9a\xb9\x46\xc0\xcd\x2d\xa9\x35\x1b\xfb\x6a\xe6\x78\xd8\x7f\x5b\xb5\x16\xb4\x9e\x42\x57\x98\x89\xd4\xa0\xdd\x6c\x0c\xa4\x56\x47\x80\xa4\x26\xaa\x9c\x2c\x29\xe4\x50\xc7\x70\x4e\xc1\xf0\x96\xda\xe1\xd9\xa1\xd7\xea\x8c\x75\x71\x3a\xf6\xe9\x95\x21\xb5\xa0\x15\x18\x91\xed\x93\x99\xa5\xa9\x99\x43\xb5\x08\x43\xe7\x56\xa6\x46\x66\x2c\x83\x47\x36\x81\x4f\x1d\x86\x0f\x59\x37\x5a\x22\xd9\x1a\x5e\xc1\x6f\x9f\x78\x8e\xc6\x1e\xb9\xb4\x19\x6c\xae\xe3\xe4\x6c\xec\x85\x3d\x2a\xe0\x16\xa8\x4c\x5f\x83\xa9\xcd\x90\x4b\x87\x6a\x85\x4e\x57\x5c\xd8\xab\x70\xde\x27\xc4\xa4\xef\x1b\xd0\x60\xc8\xe5\x58\x6f\x2d\x2d\x22\x82\xe3\x9a\x90\x59\x35\x2e\xe8\xd7\x5a\xf8\xd8\x23\xa1\xcd\xa8\x49\x1f\xe7\x04\x59\xc2\xbb\x4a\xc7\x4e\x25\x4c\x35\xfa\x8a\x2a\x88\xca\x22\xe5\x17\x11\x6a\xcb\xed\x4b\x78\x64\xe9\xad\xb9\x1d\x08\xae\xd9\x15\x31\xbb\x3b\xf8\xd6\x5f\x92\x8b\xb1\xc6\xc7\x63\xcd\x81\xf6\xb2\x91\x9a\x1a\xbf\xb4\x6a\xfc\xdc\x08\x84\x6c\x4c\x90\x69\x9f\x48\x21\xd0\x07\x73\x4b\x83\x4f\xb6\x4f\xae\x2c\xc2\xc0\xfa\x3e\xbd\x1a\x5f\x4e\xd3\xb7\xba\x2a\xb4\x02\xd1\x33\x75\x21\x33\xb5\xc7\xb9\xe1\x3f\xe3\x48\x97\xc6\x3e\xc4\xfa\x7e\x0a\x81\x10\xf6\x0c\x9f\x5c\xb2\x0c\x8d\x39\x8c\x9a\xda\x5d\xc1\x35\xb5\xba\x0b\x56\x9d\xac\xff\xa4\x92\xc3\x65\x6b\x66\x2d\x42\x97\xed\xae\x75\x34\xb2\x02\x1e\x1b\x6b\xcf\x09\xcb\x4c\x31\xa7\xdb\x5a\x0d\xbd\xc7\xb9\xc1\x2c\x32\xc3\x57\x67\x56\x8d\x9b\xda\x5d\x6e\x6e\xfa\xea\x93\x43\x35\xe6\xb6\x6f\xcf\xed\xae\xea\xf5\x09\x75\x61\x68\x8b\xb9\xa1\xb7\xa0\x45\xe1\x4b\x43\x7b\x86\x63\x9d\x87\x7d\xed\x79\xea\x30\xea\xca\xa1\xb0\x5a\xdf\x6f\xcc\xc7\x3a\xf7\x64\x52\x8d\xbc\x7f\x9c\x37\x76\xc7\x01\x07\xc7\x5a\xd2\x63\xa9\x56\x64\x78\x2d\x4b\x5b\x36\x67\x80\xa8\x78\x15\x49\x96\xc2\x13\x87\x6a\xe2\x2c\x8d\x3b\xc3\x65\x0b\x33\x19\x35\x63\xbb\x7c\x62\x68\xea\x82\x6d\x77\x16\xc3\x65\x0b\x5a\x5d\x1e\xb2\x8c\x5a\x37\x75\xc1\x1d\xc8\x89\x6b\xf8\xb3\x9e\xc1\x90\x99\x21\x84\xbd\x31\x41\x63\x6c\xbb\x3e\x37\x74\xf1\xa9\x5f\x43\x7d\x6c\x2c\x0d\x24\xd3\x65\x63\xd6\x27\xe8\x6f\x8e\xce\xc1\x7e\xc0\x41\x9b\x79\x74\x47\xed\x45\x20\x2a\x24\xc3\x2d\x22\x6b\xac\x47\xb8\xed\x2b\xe9\x98\x78\x8e\x74\x21\xca\xc6\x1a\x0e\x47\x5a\x59\x5e\xe3\x13\x53\x88\x3c\xd4\x3f\x47\xe7\x92\x91\xf6\x22\x27\x9b\xa1\x9f\x4c\x82\x0e\x0c\x7d\x90\x6d\x8f\x2b\x3f\xb7\x24\xb2\xe1\x68\x78\xd9\x3e\x39\x05\x81\xba\x34\x24\xfc\xc9\x62\x66\x3d\x43\x6b\x4c\xc7\xfe\x33\x34\xda\x78\xc3\xd0\x07\x3d\xa3\xd6\x0a\xc6\xc4\x14\x8e\x89\x84\x04\x9a\xba\xa2\xdc\x8a\x27\xf5\xc9\xaa\x71\x70\x97\xa7\x31\x41\x2e\x8d\x8f\xe2\x49\xe3\xe7\xb6\xaf\x9c\xe4\xc9\xf2\x1f\x7b\x48\x56\x94\x1b\x3d\x8d\x75\xc1\x1d\x79\x24\x74\x98\xc1\x1c\xe8\x6a\x5a\xc8\x93\x5c\xf5\x7d\x61\xee\x30\x42\x8a\x74\xd5\x0a\x84\x34\xd7\xc9\x03\xb2\xde\x2d\xb3\xee\x9b\x2e\xce\xfa\x5a\x81\x8d\x7d\x8d\x8b\x9c\xe6\xf9\xfe\x6d\xeb\x3f\x9c\xf7\x09\x1e\xd9\xc7\xdc\x5e\x3e\xd6\x28\x5f\xcd\xc6\x1a\x97\x18\x9a\x50\xc8\xd4\x77\x16\x06\xc1\x87\x86\xc6\xc7\x23\x1d\x42\x7b\x11\xd1\x32\x36\xee\x51\xbe\x31\xb7\xbd\xd6\xd4\xe9\x8a\xd0\xd2\x5b\x18\xcb\xc0\x8c\xed\x26\xcf\x7d\xaf\x8e\x4f\x90\x7e\x31\x8f\x3d\xd4\x4f\x96\xc2\x1b\xe8\x99\x5d\x13\xa7\x16\xb3\x70\xc7\x7a\xb4\x32\xb4\x01\xd2\x99\xa9\xa5\xd1\x04\xcb\xd0\xdf\x6c\x42\x7d\xea\x6b\xf8\xdc\xf2\x21\x66\xd5\x58\x77\x53\xaf\xfa\x32\x9b\x0d\xe4\x66\x36\x90\x5a\x95\x2e\xa4\x46\x97\x9f\xa1\x7a\xb9\x9e\xe9\x3c\x1c\xd7\xd4\xa5\xa9\x8b\x0d\x96\x11\xe7\x63\x22\x85\xb6\xd7\xc2\x0c\x0a\x9f\x1a\x04\xc2\x44\x1c\xd9\xfd\x0f\xb1\x23\x3b\x68\xa1\xfe\x42\x96\x12\xc2\xf2\xfb\xf3\x58\x6a\x3d\xb2\x8c\xb3\x34\xf4\xa6\xab\xfb\xb4\x67\x07\x42\xda\x13\xb6\xf5\xc1\xae\xc1\xd5\xb8\x86\x30\x56\x98\x0f\xda\x9d\xd4\x60\xe0\x2a\x1f\x03\xa4\xf7\x35\x0e\xe6\x3a\xe8\x8f\x37\xf5\x21\x36\x74\x2e\x33\xb4\x45\x96\xeb\xb4\x4a\x2e\xc6\xba\x88\xa1\xdf\xd8\x36\xe6\x4e\x28\xd2\x33\xb5\xfa\xdc\xe9\x72\xb8\x21\x14\xe3\x55\xb5\xc1\x52\x58\x8a\xbe\xa3\x3e\x53\x6e\xe4\x9b\x3a\x07\x1d\x82\x4e\x2c\x0a\x7f\xb2\x34\x01\xe1\xe9\xd4\x60\x84\xc2\x07\xb4\x31\x8c\x6f\x0f\xe6\x0e\xc3\x2f\xf2\x7a\x8c\xba\xb4\x34\x3a\x2b\xfd\xf0\x56\x1f\xf6\x74\xb8\xb6\xa3\x97\x54\xe3\xc9\x22\x1a\x3e\xdb\x5e\x3c\x72\x98\x3a\x12\x3d\xbb\xa7\x61\x70\xa8\xd0\xaa\xa2\x0b\x21\x27\xfb\x74\x6a\x48\xad\x15\xd0\x79\xcc\xd0\xf0\x19\xe5\x42\x65\xac\xd9\xae\xe9\x93\xb8\xed\x37\xa6\x16\x23\xf4\x28\x95\x6f\xd8\x35\x11\x5a\x9a\x38\x11\x7d\x98\x38\x8c\xba\x64\x69\xb2\x2d\x63\x38\x3f\xd2\xe8\xa5\xb5\x08\x7b\x1a\x66\x70\x32\x2d\xd2\x0a\xc4\x7a\x94\xd2\x98\x5a\x9a\xe2\x5a\x1a\x39\x33\x35\xa3\x41\xb9\x90\x1f\xeb\xe2\x93\x49\xb5\x7e\xb3\x6a\xea\xd2\xf2\xe9\xc4\x68\x86\x9c\xe2\xab\xa9\x55\x33\xa0\x5e\x73\x22\x8b\x11\x9f\xc6\x3a\x37\x63\xe9\xc7\x1e\xa5\x72\xd0\xd2\x48\xc2\x90\x5a\x8a\xa4\xe0\xb4\x82\x8b\x2d\x59\x6d\xf6\x28\x98\x8e\x54\x55\x14\x54\x55\x74\x28\x17\x0e\x91\x1d\xb2\x8c\x31\xb7\x03\x67\x6a\xfb\x88\xcf\xc2\x1f\x0d\x9e\x66\xcb\xc1\xaa\x59\x61\xc0\x14\x78\xad\xc4\x22\x9c\xc8\xf2\x9a\xa9\x29\xe4\x7f\x4f\xc7\x04\x3f\x77\xb4\x06\xc6\x76\x79\xe8\x50\xcd\xd4\x5e\x36\x3d\x8e\xe6\x55\x01\xf2\x6d\x65\x06\x05\xb5\x03\x47\xf2\x0c\x76\x58\x37\xec\x55\xe3\x96\x8f\x63\x97\xc7\xc6\x3a\x87\xbd\xe8\x7c\x63\x65\xe8\x1c\x61\x6a\x3c\xa4\x7c\xfa\x1b\xcb\xd0\x4f\xf6\x46\x7b\x7d\xad\x90\x05\xeb\x09\xa1\x4d\xa8\xb3\x42\x4f\x9d\xd5\x84\xaa\xff\xd6\xaf\x3d\x3f\x72\xcb\xe6\xe3\xa8\xbd\xf0\xb8\x0e\xdd\x56\x20\x47\x2b\x18\xa9\x2a\x33\x9e\x96\x14\xc1\xeb\x49\x6c\x8f\x9a\xe1\x1d\x59\x81\xbc\xa0\x38\xf4\x48\x62\x67\x00\xe7\x04\x49\xc1\x5b\x22\xa6\x40\x4e\x7a\xfc\x6d\x22\x3d\xce\x00\xf6\x52\x86\x5d\x0e\x7e\xeb\xd7\x30\x8f\xf2\xd7\x36\xb9\x70\x90\xbf\xa4\xd8\x99\xac\x88\x7c\x59\xf7\xe0\x73\x05\xb6\x38\x59\xa1\xbb\x22\x6a\x17\xf2\x9a\x80\x1b\x2d\x55\x79\x56\x54\x95\xe3\x50\xdb\x3d\x06\xf5\x0f\xc5\x05\xc6\xd4\xd1\x9e\x31\x96\x79\x8e\xec\x9a\xe0\xf6\x35\xdb\x65\x3d\x51\x12\x55\x7e\xa4\xaa\x5c\x5b\x54\x1c\x49\xc6\x55\x41\x9e\xd1\xbc\x28\xb1\x48\xb7\x9f\x1d\x4d\x5d\x02\xa9\xe9\x69\x2b\x12\x1b\x6b\xce\xaa\x1f\x14\x34\x46\x32\x16\xd8\x84\xba\x74\x7c\xf8\x64\x48\x8e\xd3\x0f\x5a\x4b\x14\x97\xd9\x81\x18\x21\xcc\x74\x7c\x1a\xb7\xba\xa2\x6a\xfb\x33\x8f\xa5\xf0\x39\xdb\x15\x57\x8e\x37\xf3\x2e\xc1\x41\x96\x6a\xa1\xb1\x8e\x0d\x1d\x12\x63\x5d\x4d\x1c\xaa\xb5\x32\x34\x7e\x69\xe8\x82\x6b\x30\x64\xcd\xf2\x9f\xe7\xe3\xc2\xf6\x7c\x53\x7b\x86\x2c\x55\xd8\x94\xa5\x89\x69\x3f\x68\xc1\x32\x2e\x9b\x21\xd9\x00\x7c\x5b\x1e\x93\x1c\xff\x38\xe8\x74\x07\x73\x3b\x68\xa6\xa8\x0e\xeb\x35\x7d\xce\x6b\x79\xb6\xaf\x4e\x4d\x14\xb7\x30\xd0\x67\xe9\xd4\x62\x29\xf1\x21\xc7\x09\x0d\x5f\x38\x5d\xcc\xed\x23\xd9\xb5\x15\x57\x57\xb1\x07\xb6\x2b\x86\x86\x56\x77\x6d\xe2\x19\x22\xac\x1a\xc8\xcd\x07\x96\x51\x13\x9b\x50\x5c\x43\x9f\x46\x0e\xd5\x7c\x1e\x2e\x5b\xbe\x29\x44\x33\x8b\x68\x40\xca\xe7\x43\x64\x57\x6c\xbb\x49\x0c\xda\x4d\xb7\x4f\xa8\xd8\x78\x49\xa6\x06\x83\x65\x36\xc2\x96\x80\x87\x28\xae\x36\xa5\x66\x6a\xf9\x8a\xcb\xad\x3a\x49\x1f\x53\x87\x22\xd5\x6a\x8b\x2a\xa7\x48\x8a\xc1\x09\x18\xad\x88\xd2\xa3\x6b\x53\xf6\x7e\xfd\xc2\x5e\xde\x22\xb3\x95\x41\x35\x16\x86\x56\xc4\x86\x06\xd5\xf4\xb8\x6e\x2a\xab\x33\x5e\x13\x54\x75\xa0\xd2\xaa\x24\xe9\x78\x49\x4b\x5c\xf5\x6b\xdc\xa2\xaf\xe1\x33\x9b\x10\xbc\xbc\x4f\x35\x07\x61\x7e\xc3\x26\x9e\xe7\xc6\x2a\x42\x78\x94\x58\xc4\x06\x7f\x5d\x7e\x96\x8f\x89\x10\x3d\x99\x0c\x3e\x37\xa8\xe6\x82\x7f\x6a\x2e\x0e\xb4\xdf\x2b\xec\xf0\x79\x6e\x10\x24\xee\x34\xc3\x9e\xa5\xa5\x33\x53\x67\x2b\x5a\x53\xdb\x7f\x4c\xed\xa0\xd9\xcb\x63\x79\x79\x8c\xb1\x14\x3e\x43\xf8\x38\xa2\xd8\x99\x90\xdb\x48\xa3\xa5\x74\x60\x5b\x50\x38\x55\x9e\x89\x03\xa4\xc3\x15\xde\x8e\x75\x6e\xde\xd7\xb9\x45\x9f\xa0\x67\x96\x06\xb3\xbe\xc6\x4f\xfb\x1a\x87\x5b\xbe\x98\x18\x52\xd1\xfe\x98\x98\xce\x1d\xa2\xee\xf6\x55\x16\x8d\xe7\x62\xd0\x0e\x9f\x07\xed\x17\x5e\x2b\x1a\x94\x1b\xa5\x26\x21\x46\xb6\xd7\x2c\x63\xc0\x0a\x67\x85\x79\x85\x39\x7d\x22\x97\x51\xf6\x62\x23\x8d\x19\xe5\xf3\x53\x87\x6a\xfe\x77\xd9\x9f\x35\x76\xaf\xeb\x4b\x95\xbc\x78\x68\x07\x46\x34\x26\x94\xcc\xa0\xc8\xb9\xe3\xa3\x9c\x08\xce\x0c\xe9\x80\x4f\xc0\xd5\xcc\xd4\x45\x87\x9a\xd1\x3e\xc2\xf7\x91\xd6\x80\x4e\xd7\x99\xdb\x7e\x92\x5a\x44\x23\x31\xb5\x06\xec\x07\xe2\xd4\xf6\x1d\xe8\x34\xab\x58\x64\x8b\x8f\x99\xa1\x15\x36\x5d\xf2\xec\x8e\xda\xcf\x79\x39\x59\x11\x65\x91\x26\x25\x19\x7b\xa6\x75\xbc\x25\x89\x8a\xc1\x69\x6d\xac\xc8\x89\x6a\x1c\x6e\x79\x25\xbf\x84\x08\x8d\xdc\xde\x85\xaa\xce\x48\xa1\x45\x4e\xc6\x1a\xf2\x48\x62\x53\x01\xe5\x52\x08\xab\xbd\x96\xcd\x75\xf0\x8e\x82\x89\x13\x65\x46\x0e\x44\x95\x14\x94\x99\xca\x48\xaa\xeb\x51\x6e\x04\x41\xb7\xf0\x03\x0a\xce\x0f\x74\x8c\xa7\x15\x28\x4e\xc4\x19\x1c\x88\x32\x56\xca\xb9\x15\x9b\x12\xca\x4f\x07\xf3\x31\x92\x6b\xfe\xff\x4e\x3a\x0e\xd4\xcc\x60\x9e\x91\xdf\x5f\x22\xbd\x31\xf4\xe9\xc2\xaa\x71\x18\xdb\xc1\x91\x2f\x50\x64\x9c\xe3\xe4\x99\x33\x11\x31\x5e\xd6\x31\x75\xa8\xce\xa0\x24\x63\x0d\x5e\x54\x1a\xca\x48\xb2\x67\x39\xcf\x9d\xed\xdf\xb9\xc5\x0b\x3f\xb2\x42\x0e\x25\x55\x1c\x29\x33\x38\x14\x71\xb2\x2b\xe0\xfc\x44\x50\xf8\xb6\x8c\xab\x43\xb5\x8d\xb7\x94\x19\x29\x29\x9d\xe7\xb9\x51\x1b\x9c\x6e\x1b\xe7\x68\x11\x83\x23\xf9\x09\x0b\xb8\xce\xf3\x08\xd9\x33\xca\x57\xcf\xb6\x85\xa9\x92\x4a\x93\x39\x0e\x6c\xc9\xa3\xd2\x31\x64\xff\xbe\x5a\x2f\xf3\x50\x5e\xc6\x1a\x9c\xda\x21\x25\x49\x69\x74\x75\xcc\x69\x2b\x78\x51\x57\xc7\x52\x5a\x53\x0c\x4e\xee\x28\xe4\x01\xfb\x3c\xc9\x43\xee\x13\x54\x5e\x10\x14\x9e\x1e\x29\xb4\x24\xa3\xdc\x95\x21\x03\xfb\x38\xef\x6d\x19\x6b\x30\x92\xe2\x4c\xd4\x99\x2a\x29\xeb\x7e\xe7\xe3\x5f\x3d\x5b\xe7\xec\x27\x64\xa0\x2a\x98\x3a\x11\x11\x16\xaa\x46\x4b\xc7\xf8\x91\x3c\x33\x38\x11\x27\x65\x51\xe5\x34\x09\xf1\xa3\x8b\x4b\x47\x53\x7a\x47\x65\x80\x8b\xb4\x3c\xa3\x87\x6a\xfb\x62\xb9\xe7\x3a\x3f\x42\xb6\x7e\x94\x26\x37\x92\x3b\xea\x44\x52\x1a\xb2\xda\xa1\x87\x02\xa6\x90\xdc\x52\x08\x4d\x86\x5c\x39\x4c\x1e\x3b\x44\xdc\xe2\xa0\xbd\x21\xbb\xcf\xed\xd8\xd4\xec\xdc\x67\x21\x7b\xce\x63\x9e\x3c\x66\x30\x90\x0e\x2a\xa2\xd2\xe8\xa8\x2a\x37\x28\xf5\x93\x17\x21\x37\x92\x21\xea\x87\xa8\x2a\xb3\x45\xb0\x1d\x5f\xd8\x9b\x31\x42\xf1\x6c\xed\xd3\x0f\xe8\x7b\x87\x6c\x0b\x2a\xb2\xcf\xfa\x76\x59\x15\xf5\x49\x21\x11\xc6\x22\x7a\x55\x4c\x93\xdb\xaa\x02\x87\x79\x3c\x37\xe3\xf3\xf6\x7a\xcc\x74\x6e\xd7\xc4\x3c\xa7\xea\x49\x76\x15\xb3\xad\x71\xb1\x98\x37\x51\x31\x67\xb1\x1f\xbb\x23\x7c\x34\xa8\x0a\xff\xb0\xd2\x6f\xaf\x31\x6f\x2b\x8f\x53\xb5\x46\xe4\xd0\x58\x4f\xd0\x0c\xcc\xd0\x59\xd2\x60\xc8\x27\x93\x50\x97\x1b\xe5\x7b\x8a\xaf\x3e\x3b\x1a\x5c\x1a\xfa\xe0\xe0\x73\x0a\xa6\x72\x15\xeb\xe9\x42\x44\x6f\xcd\x01\x75\x8c\xc8\x62\xd6\xf6\xb0\x37\x36\xd4\x4c\xad\x1b\x1a\x2f\x3b\x0c\xbd\x74\xe8\xd6\xd2\x90\xb1\xb4\x5f\x53\x57\xb6\x57\xe4\x0c\x55\x7b\x6c\x97\x43\xf9\x8b\xcf\x52\xea\x70\xab\x0e\xc2\x4b\x9d\x5f\xf6\x09\x2e\xb2\x3c\x72\x66\x11\x7c\x6c\xe8\xac\x6b\x07\x6a\xc6\xd2\x8b\x1e\x4b\xa1\x58\x45\xcd\x9c\x2e\xd7\xb0\x19\x32\xb2\x02\xc1\x2d\xe9\xaf\xc6\x3e\xcc\xfa\x18\x0e\x9d\x2e\x17\x8d\x6b\x3c\x0d\x50\xcc\x14\xf0\x91\x45\xd4\x5d\xbd\x19\xba\x28\xc7\xd8\xd0\x37\x97\x53\xdc\xf5\xef\x56\x9e\x1f\x34\xa1\xec\xb5\x6c\xca\x6b\x22\xdf\xbe\xb4\xa4\xf2\xbb\x86\xb9\x03\xdf\x2e\xcb\xe2\xc4\x5e\xfc\x24\x87\x6b\x7c\xb1\x0a\xdf\xb8\x59\x96\x18\xeb\x2c\x7a\x5e\x1b\x7a\x1b\xdf\x83\xb0\x2c\x23\xf2\x62\x07\x2f\xe3\xd1\xb2\x3d\x05\x8d\x85\xc8\x1c\x8e\xd5\xaa\x32\xc6\xd2\x22\x1a\x98\xa8\x35\x66\xaa\xce\x25\x25\x1d\x46\x99\x91\x43\xb5\xa3\x0e\x45\x5a\x95\x64\xaa\x2a\x8b\x62\x04\x07\xc5\xc0\x6d\x8b\x68\xac\x2c\xe2\x19\x56\xb2\x44\x98\x24\x33\x2a\x61\x68\x0b\x57\x25\xe8\xa5\xe5\xc3\xcc\x58\x96\xf5\xd4\xd6\xd2\x44\x31\x30\xa3\xf6\x0d\x1d\x9e\xe6\x47\xe5\xe7\x8e\xce\x3d\x19\x8a\x9a\x39\x3e\x44\xbc\xa5\x28\x37\x2b\xf9\x92\x65\x5c\x95\x04\x4c\xa5\x65\x68\x70\x88\x47\x19\xd9\x19\xb5\x53\x57\xe5\xe6\x16\xa3\xb8\x08\xf3\x76\x6c\xac\x92\xa7\x8c\xf2\xaa\x31\xa1\x4a\xa8\x0f\x92\xd6\x58\x39\x0c\x9d\x21\x1b\xd8\xaf\xa3\x72\x32\xe4\x15\x41\x69\xb4\x45\x21\xa2\x01\xa3\x3e\x29\x35\x71\x6e\x1f\xd3\x2f\xf4\x8c\x6a\x42\xd9\x8d\x24\x43\x2f\x72\x9f\x91\x46\x27\x0e\x41\x37\xec\xc5\xcb\x6f\x0a\xa1\x3e\x8d\xe4\x4e\x4f\xa9\x89\x53\x3b\x10\x07\xa6\x86\x47\x4e\x07\x66\x28\x96\x70\x7c\x3a\x19\xc9\x79\xfe\xc6\x55\xf3\x77\xba\x10\xe9\x63\xad\x81\x19\x9a\x48\x01\x19\x4f\x51\xdc\x60\x4a\x38\x6e\xe7\x36\x77\x32\xce\xd8\xb2\xad\x2a\x96\xda\xc2\x3e\x95\x6c\x09\x18\x3f\x52\x11\x4e\x29\xc5\x7c\x85\xe2\xab\x33\x89\xa1\x31\xb9\xd6\x82\x16\xe4\x43\x53\x33\x30\x05\x16\xf8\xa4\x63\x8d\x96\xac\xa8\xb2\xd2\xa1\xdb\xa2\x8c\x4b\x4a\x33\x6a\x09\x38\x37\x51\x66\x6a\x35\x3e\x13\x49\x11\x48\x6e\x29\xa2\xdf\x37\xf2\x1c\xd8\xe1\x16\x51\x2b\xd7\x53\x48\xa2\x98\x71\x22\x60\xcf\x1c\xc2\xc7\x2a\xee\x10\x30\x92\x97\xf3\xb9\x64\xd4\x86\x92\xd3\xc8\xcb\xcf\x68\x41\x52\xf8\x81\x84\xc6\xbb\x93\x97\xcd\xf3\x69\x19\x6b\x0c\x05\x05\xa7\xb9\x45\xd4\x11\x54\xb1\x25\xcc\x68\x59\xdc\xe8\xcf\x06\x9d\x97\xe7\x0a\xdd\x16\x30\x52\x95\xa1\x58\xd5\x95\x94\xce\x0b\xa6\xbf\xe4\x75\x76\x4f\x81\xad\x89\xac\x90\x1d\x51\xc6\x02\x8e\xe6\x84\xfc\xfb\x0b\xee\x9e\xc5\xd8\x75\xfc\xfb\x13\xe2\xec\x3a\xae\xfe\x21\x58\xfb\xe2\xb7\x58\x4a\x65\x5f\x7e\xaf\x30\xf4\x05\x5b\x6d\x7f\x8d\x7b\x90\xed\x6c\xeb\x67\x55\xcf\x90\x5a\x08\x0f\xb6\xe2\xa3\x8d\x67\xaf\xd1\xb1\x8d\xb6\xc4\x96\xda\xa1\x29\x41\xe5\x69\x1d\x5b\xeb\x48\xd1\xc6\x1a\xc3\x15\x77\xad\x13\x1b\xbf\x09\x0a\x2f\xa1\x38\xb3\xf2\xdd\x3a\x06\x3b\x15\x3f\x96\xd4\x5c\xae\xb1\x50\x6f\xba\x7c\x5b\x58\x0d\x9f\x5c\x8c\x6f\x0f\xf6\x7c\x41\x35\x26\xc3\x9d\xfc\xa9\xa2\xe5\x78\xcd\x39\x92\xeb\x66\xee\xb3\x9e\x7b\x6a\x87\xc7\x9f\x55\x18\xa9\x8f\xdd\x7e\xcd\x98\xda\x88\x7e\xd7\xfe\xb6\xf9\x1d\x94\x3e\x0b\xe9\x79\x19\xd3\x14\xfc\x75\x37\x75\x84\x5c\x8c\x24\x12\xb7\x6b\xec\x3c\xf7\x93\xc4\x7a\x5e\x64\x85\x9e\xb1\x14\x8e\xb1\xed\x41\x9e\x6b\x73\x4a\xbd\xa7\x32\x30\x35\x34\x12\x77\x68\x1e\xb3\x6a\x2d\xd9\xd0\x06\xe4\x60\x35\x5e\x0c\x9a\x3f\x31\x3e\x6e\xcc\xf1\x6e\xe4\x64\xfc\x8b\x4e\x08\xa4\x50\xcc\xdf\x4b\x86\x26\xb2\x63\x5d\x1c\xd9\x8c\x9a\x29\xc4\x34\x32\x02\x11\xe1\xe1\x9e\x6e\x8e\x14\x8e\x92\x85\xa8\x2d\xd3\xaa\xac\x76\x54\x49\xc7\x2e\xc7\x5d\x81\x78\xc6\xd1\x78\xda\xee\x5e\xfd\x1c\xbf\x14\xbc\xd5\x42\x71\xb0\x30\xe3\x78\x6a\x76\x42\x87\x11\x86\x6d\xe8\xf8\x3a\x97\xea\xe4\x76\x10\x50\x70\x3d\xee\x08\x2f\xd7\x98\x98\xe3\x23\x4d\xf2\x32\x26\x56\xf8\x98\x7f\x3f\x11\x67\xef\xe6\xd7\xf9\x1c\x82\xa5\x91\x28\x67\x9e\x6f\xce\x01\x9e\xce\xa9\x0f\xcc\x19\x42\x0e\xda\xba\x1a\xd9\xbe\xba\x3a\xf8\xdc\x8d\x2c\xa5\xca\xfd\x55\xac\x27\x6a\x0d\xc2\xd4\xb9\xb9\xe5\xe3\xd0\x2a\x63\xa1\x91\xb4\x31\x9f\x4d\x90\x99\xe1\xc3\xa0\x8f\x62\x96\x25\x8e\x72\xf7\xc8\x61\xc8\xe5\xcf\x8d\x89\xfc\x40\x55\x79\x45\x54\xb9\xc9\x8e\x5e\x9e\x28\xb3\xe1\xb3\x37\x70\x4b\xec\xd0\x8a\xa0\x70\x2d\x94\xeb\xad\xf5\x81\x2e\xf4\x6a\x17\x6b\xd7\xcf\xa9\x97\xfa\xa7\x68\xef\xe3\xe4\x5e\xfc\xbb\x74\xb4\xfa\xa6\xdf\x5c\xcf\x77\x0f\xbd\xe3\xcf\x36\xb1\x70\x9d\xef\xac\xc2\x8d\xef\xd1\xb7\xb2\xcc\x86\x2f\x2f\x78\x58\xeb\xe0\x1f\x1b\x9f\x85\x48\xef\x58\x0a\x97\xf2\x39\x3c\x64\x23\x2a\x89\x0f\x7d\xd2\xcb\xd7\x62\x69\x72\x39\x0c\x8c\xa9\x0d\xc9\xc4\x22\x9c\x89\xd3\x8e\x56\x03\xaa\xea\x2b\xb9\x70\x28\x72\x73\xfd\x79\x6e\x31\x30\x73\xf4\x29\xd2\xdd\x62\x2d\xa9\x59\xae\x13\x77\x5f\x62\x0e\x53\xab\xbb\xbb\xd8\xb6\xf6\x2d\x0c\x8d\x5b\x04\xbe\xaa\xd6\xb8\x0c\xaa\x35\x05\x01\x0f\xc7\x04\x2a\x2b\xb8\xc5\x5c\x61\x2b\x35\x18\xcc\x1d\x13\x53\x14\x93\x37\x0c\x6a\x6f\xed\xea\x81\x65\xc4\x39\x92\xf1\xd6\xfc\x3f\x53\xae\xd3\x49\xcd\xd9\xc6\x9c\xdc\xc6\x1a\x80\x38\xb7\x7c\xa5\x5a\xa7\x5b\x8d\x09\x3a\xcb\xe7\xa6\x19\x6e\x6a\x13\x6a\x3e\x8f\xc6\x32\x7c\x32\xd6\xf0\xa9\xe3\xb5\xf2\xb5\x4e\x87\xa0\x97\xc6\x7a\xce\xba\x59\xda\xd9\xf3\x7c\x4c\xd0\x49\x69\x6f\x25\xff\x82\x5b\xd9\x37\x4b\xe1\x2b\x96\x12\x0b\xfa\x14\x3e\x63\xe9\xe6\xb3\xd8\x2c\xe7\x88\xdd\x30\x5c\xcf\x27\xaf\x9a\x0f\x6c\x97\x83\x63\x9f\x9c\x3b\xd4\xcc\xe5\xdc\xf0\x5f\x37\x5f\xbe\x7c\xdc\xf1\xa4\x0f\xde\x0a\x7b\xd1\x19\xbe\x70\x0e\xe2\x28\x0e\xe7\x5e\xb9\x4d\x70\xfb\xa2\x9f\x03\xb5\xae\x3d\x07\x04\x69\x71\x32\xf1\xc0\x71\xc3\x6a\xf7\xa3\x92\x80\xb8\x99\x24\x9e\x1b\x80\x83\xe7\x1b\xb3\x8d\xe7\x6c\x41\xf1\xd4\xa6\xcd\x63\x1b\xb1\x07\xc5\x99\x9e\x92\xc2\xf2\xfe\x30\xd9\x9b\xaf\x57\xd5\x1e\x5b\x33\x0e\x6f\x8b\x23\x84\x47\xf7\x27\x7d\xf9\x4f\xbe\xf1\x71\x5f\x7c\x17\x1d\xcb\xdd\x3c\xa8\x98\xef\x5c\x3d\x7a\x5a\x71\xff\x64\xec\xfe\xe9\x5d\xaa\x38\x0c\x79\xbf\x7d\xd4\x52\xb2\x4d\x08\x24\x90\x7e\xd0\x39\xde\x43\x07\x72\x6b\x1f\x76\x20\xb7\x59\x1e\x0f\xcc\xdb\xbe\x8f\x43\x08\x8a\x01\xf2\x41\x90\x9f\xc4\x70\x33\xcf\xd9\xdb\x6e\xe5\x39\xdb\x52\x3b\x74\xf9\x51\xbe\x0b\x5a\x1c\x5d\xdd\x5f\x89\xc0\x74\x40\x7c\x40\xa2\xa7\xf8\x3a\x72\x46\x64\xf3\x6c\xc8\x9b\xe8\x6d\x9d\x09\x78\xd9\xff\xff\x2a\x5a\x52\xb1\xe5\xfb\x7e\x7b\xeb\x77\x72\xc1\xc6\xf0\xef\x72\xb4\x79\x7d\x1b\xd2\xde\x99\xb7\x5d\x2b\x78\x9b\x02\x1e\x3c\x42\x7d\xa8\x77\x17\x58\xcc\x11\xd1\x7d\xc7\xb3\xeb\xf5\x0b\x2f\x08\x3a\x77\x52\x3b\x01\x73\x10\x17\xc0\x7a\xe0\xb2\x82\xb3\x27\x0c\xae\x13\x3b\x8c\x4e\x5c\xd9\xf0\x76\xbd\xdd\x23\x77\xe8\xc2\x08\x30\x37\x61\x96\x0f\x2f\x9d\x5f\xa5\x10\xe4\xa7\xcd\xaf\x47\x72\xe3\xd0\x41\xd2\xeb\xe2\xc8\x42\x79\x55\xd7\xd1\x52\xa9\x19\xbb\x20\xad\x36\x1e\xcb\x6f\xba\xdc\xe0\xaa\x38\x34\xea\xa5\x20\xf6\xcc\xe3\x0e\xc6\x84\x70\x38\x39\x79\x72\xe1\xcc\x09\x10\x34\xb8\x66\x1a\xe6\xa7\x08\xfa\x20\x49\xe4\xa9\x19\x9c\x3b\x92\x9a\x4e\x63\x90\x4c\x43\x88\x46\xb5\x86\x9d\x29\xdc\x74\x0a\x8d\x35\xe1\x68\x53\x93\x82\x0c\xc2\x73\x97\x61\x94\xf6\xd5\x7d\x39\x1d\x4a\x4d\x81\x3d\x3b\x7b\x62\x16\xa4\xb1\x67\x97\x57\x9c\x5d\xb7\xbd\xa8\x39\x37\x3d\x68\x5a\x1e\x44\x6a\x7a\x71\xe5\x24\x32\xf3\xb3\xcd\xd7\xfe\x7a\xe0\x82\x0b\x07\x6e\x5b\x5a\x9e\x0f\x9a\xae\x1b\x03\x77\x8d\x31\xcd\x39\x88\x2f\x38\xfa\x5b\x0e\x7f\x18\x54\x2a\x54\x5c\x69\x26\x57\xe2\xa7\xaa\xe7\xaf\x3d\x3a\x73\xc0\x12\xae\xde\x34\x56\xd7\xa1\x63\xa6\xe6\xdd\x3e\x9e\x15\xc7\x50\x06\x61\xe0\xa5\x61\x7c\x27\x79\x81\x0b\x41\x65\x10\x83\x0c\xa6\x5e\x04\xc1\x20\x17\x35\x55\xe9\xf8\x45\x81\x9f\x99\xa5\xe1\xc0\x4b\x3d\xd7\x4c\xc1\x71\x4c\x31\xed\x37\x5f\x2e\x56\x54\xcd\xb1\x9f\xdd\x3b\x4b\xb7\x05\xf4\xa7\x2e\x01\xcc\x9d\xfc\x8b\x34\xd8\x20\xf1\xdc\x69\x9a\xdc\x6f\x50\xaf\xc0\xaa\x38\xfb\x7c\x6b\xba\x67\xae\x80\x58\x00\xab\x1b\x86\xb3\xbd\x81\xb9\x30\x8a\xbe\xec\x76\x96\xcd\x30\xd0\xdc\xb0\x9a\x5b\x13\x82\x38\x3d\x19\x7f\x5e\xe0\xe4\xd6\x62\x28\x8c\xac\x89\x68\x9e\x0c\x06\x5d\x18\x5a\xe6\xde\x25\x9f\x1f\xe5\x04\x1f\x3f\x32\x5e\x7c\xa5\x3f\xba\x24\xc0\x79\x85\xe7\x3d\x70\xaf\xd0\x9f\xd6\xf3\xe2\x97\xb9\xde\x6f\xdd\xbf\xbb\xeb\xfd\xf6\xf0\xe9\x7a\x3f\x5d\xef\xa7\xeb\xfd\xeb\xb9\x5e\x07\xe4\x67\x61\x9d\x4f\xb7\xbb\x7e\xfc\x53\xba\xdd\xcf\x84\xb7\x28\xf5\x77\xf2\xba\xb5\x73\x77\x38\xfe\xd1\x5e\x57\xfd\xf4\xba\x7b\x9f\x4f\xaf\x7b\x4c\x5e\x9f\x5e\xf7\x65\xdd\x23\x00\xe9\xa7\xc7\x5d\x3f\xfe\x71\x1e\x77\x77\x30\xce\xde\x21\xf0\xf5\xea\xe6\xfe\xd8\x52\xcd\xee\xda\xcc\x36\xf7\xed\xd0\xce\x7c\x10\xa4\xed\xd6\xfd\x0e\xe5\xdd\x65\x8a\x23\x97\x17\x5c\xdd\x90\x0f\xd8\x03\x49\x58\x8d\xdb\x87\x07\x02\xbb\xad\x5b\x93\xc6\xad\x59\xab\x35\x6e\x27\x78\x03\x90\x0f\xf6\x03\x20\x1a\xe6\xcd\xd5\xd7\xab\x9b\x96\x07\xa1\x17\xb8\x57\xf7\x57\x2f\xad\x5e\x95\xe4\xae\xa8\x30\x28\x2e\x69\x0e\x0f\xad\x00\x1d\xd0\xa9\x13\x9c\xdf\xe7\x4b\xa1\x0e\x88\x93\xdd\x85\xaa\x5d\xb2\x67\x63\x1b\x14\x9b\x9c\xb8\x41\xea\xbd\xe2\x3b\xb8\x9a\x84\x78\x6e\x83\x89\x17\x78\xc5\x55\x08\x79\xfb\x87\xd0\xe6\xdc\x0a\xdd\x0b\x91\x5c\x21\x1b\x96\x43\xda\xce\xe3\xe3\xed\x04\xd4\x1b\xb7\x75\x02\xff\x76\x4b\xd6\x1e\xad\xdb\x09\xf9\x50\xaf\x3d\x00\xbc\x51\x6f\x60\x47\x16\xb8\xa2\xad\x97\x95\x5c\xff\xfb\xb2\x41\x3f\x4d\x6a\xed\xd3\x76\x96\x04\x4f\x2f\x4d\x7d\x20\x06\x90\xb7\x18\x7e\x1b\xc5\x60\xee\x81\xc5\xc7\x60\xc1\xfb\xd5\xe1\x9d\xd1\xf9\x51\x58\xdf\x6a\x7b\xfd\xf2\xa4\x8b\x96\xe2\x2a\x80\x73\x82\xc4\x08\x83\xd3\xaf\xf6\xf8\xee\xb8\xdd\xf8\xa0\x55\x3a\xb3\xb8\xdd\x4d\x2a\x43\xbc\x63\xc1\x75\x79\x07\x5c\x7e\x7f\xf1\x89\x1c\x25\x2f\x8c\x63\xc5\xfb\xbd\xee\x89\xfa\xe1\x70\x6c\x7f\x83\xc7\xa1\x00\xa7\xbc\xdc\xf0\x7b\xdf\xd9\xbe\xd5\x35\x24\xdf\x4d\xf6\xcf\xc5\xe5\x85\x46\x48\xc0\xce\x50\xe2\x97\x47\x04\x1f\xf8\x32\x81\x43\xe4\x2b\x8f\x1a\x24\x67\xc2\xa4\x75\x53\x17\xbf\x4d\xe4\xdc\x2d\x6f\x05\x3c\x75\x02\x27\x0a\xbd\xe0\xc4\xc0\x6c\x7e\x2e\xbc\xb3\xac\xa4\xbd\x6d\x6f\x3d\xb0\x54\x2f\x78\x3f\xc1\x9a\x48\x65\x7f\xaf\xbb\x5f\xf1\xfa\xff\x5f\xb6\xdf\xe9\x82\xab\xff\xce\xf3\xf9\x1e\x71\xe4\x89\x44\xf5\xaa\xb6\x3f\x8d\x4c\x4e\x96\x38\x5e\xff\xc2\xf7\x10\x94\xb7\xae\x7e\x68\xe4\x5f\x06\xfc\x97\xfb\x83\x9d\x1d\x37\x3f\xe7\xcb\x08\x7e\x62\x57\x51\x47\x58\x4b\xfc\x69\x5d\x45\xc9\xfe\xcf\xeb\x2a\x22\xf0\x07\x78\x8b\x28\xf6\xe6\x66\xba\xf6\x16\x25\x9f\xf9\x6b\x1b\x0a\x59\x5f\xb7\x8b\xf7\x09\x1c\x79\xcf\xd3\x99\x36\xb6\x5e\x46\x02\xbe\x17\x0e\x44\xa0\xc8\xfd\xb1\xfd\x1c\xf9\x13\x0e\x4c\x08\xc3\x85\xba\xd5\xd9\xa6\x6d\x17\xef\x52\x3b\x36\x1b\x85\xaa\xd0\x61\xbc\x30\x63\x07\x38\x72\x6c\x4e\x26\x9e\x7d\xa6\x38\x63\xa6\x60\x61\x2e\xe5\xd8\x0c\x12\x2f\xad\xb6\xf4\x1e\x28\x9d\x25\x40\x04\x7e\x98\x82\xb2\x46\x72\xa2\x6c\x9c\x17\xdc\x66\xfe\x38\xa4\xbd\xe5\x6e\xee\x17\xdb\xab\x34\xe8\xe0\x4c\xfc\x65\x9b\x70\x4b\x97\x74\x1f\x01\x10\x7b\x81\x7b\xfb\x41\xaa\xb9\xf3\xf7\xa8\xa0\xfe\x3d\xf7\x16\x7e\xfc\x7b\x71\x3e\x7a\xbb\xeb\xeb\x87\xf1\x3f\x6f\x33\xf0\x4f\x0b\xfc\x31\x16\x38\x3f\x76\x11\xfe\xc5\xa6\xb7\x31\xf8\x9b\x16\xf8\xae\x20\xf1\xaf\x6b\x7a\x3b\xa6\xf2\x51\x16\x78\x70\x18\xbf\x9f\xe9\xcd\xbc\x20\x57\x39\x26\x9f\xc7\x79\x99\xce\x7a\xed\xbc\xa9\x1d\x06\x89\x97\xa4\x20\xb0\x97\xe7\x5e\x59\x55\xbe\xb3\x97\x7a\xa9\xd1\x07\x73\x00\x8b\xd5\xae\x38\xdc\x7c\xef\xee\x01\xfe\xf7\x64\xf0\xa6\x68\xb8\xaa\x5c\x2d\x19\x5e\x22\xc4\x2d\x86\xf6\x63\xad\x03\x2c\xee\xcc\xf9\x0d\x27\x13\x10\x6f\x2c\xec\x1d\x7d\x89\x98\x17\x89\x66\xe0\x02\xda\x83\x69\x71\xbb\xf9\x7a\x91\x06\xc7\xea\x77\x75\xe2\x0e\x27\x1b\x77\x24\xf1\xb5\x8e\xdd\x3d\x7c\xbb\x6b\xd4\xef\xf0\x1a\xfe\xb5\x41\xdc\xe1\x0f\xdf\xee\xbe\xdd\xd5\xb0\xfc\xfb\x37\xf2\xae\x81\xdd\xd5\x1b\xf9\x1f\x8f\x0f\x77\xf8\x63\xfd\x8e\xf8\x76\xf3\xf5\xca\x9b\xfc\x02\x7e\xcb\x4c\x98\x6c\x2d\x33\xec\xbe\x20\x3d\x5f\x63\x28\xfe\xf9\x7a\x75\xf3\x15\x7d\x3b\x5d\xfc\xb0\x0d\x78\xc9\x36\xf4\x15\x7d\xea\x9c\xdb\x22\xb0\x6d\x1b\x6f\x7e\xb1\xe9\x0f\x7d\xd9\xc8\x85\x3a\x51\x64\x03\x3d\xb0\x6c\x99\x09\x70\x06\x20\x35\x91\x9a\x68\xb1\x97\x82\x2d\xa7\x76\x11\x6a\xff\xfb\xec\x14\xf3\xfb\x16\x56\x3e\x26\xa8\x2f\x73\xad\x03\xb0\x51\x62\x41\xe7\x39\x02\xb1\x57\xbe\x4a\xeb\x9a\x0a\x63\x70\xf5\x8b\x24\xf4\xbf\xfc\x98\x95\x01\xf2\x16\x7b\xfc\xc1\xf1\xda\x36\xba\x7f\x40\x88\x54\x31\x73\x36\xb4\xb8\x69\x8a\xc3\x9b\x43\x51\xc2\x01\x5d\x0d\xa3\x0a\x60\x8f\xd0\x4c\xa7\x71\x98\xb9\xd3\x28\xcb\x5f\x01\xd0\xc0\xb0\xb7\x46\x1f\xaf\x5a\xf8\x44\xb2\x44\xbd\x78\xef\xa2\x61\xf2\x1b\x6c\x97\xbf\xfd\x7c\xd9\xeb\xc7\x69\xe4\x1f\xbe\x46\xf5\x76\x6d\x6d\x26\xcb\xc0\x1e\xe6\xfb\x95\x4e\xbc\xca\xe3\x3a\x32\xe3\x34\x17\x7b\x0f\x1c\x8f\x3b\xca\x92\xe9\xf4\xfc\x14\xf1\xf5\xbd\x77\x62\xb6\xe6\xc8\x56\x9a\xab\xcd\x70\xaa\x6b\x26\xd3\x23\x5e\xe2\x48\x1f\x4a\x24\x94\x53\x14\x08\x7d\xc3\xea\x8f\x18\xf6\x5a\x1b\xfd\x8e\xa6\x86\xbe\xef\x0c\xc6\x87\x9a\xdf\xbd\x1d\x06\xa9\xe9\x05\x3f\xe3\x3b\x6e\x7f\x88\x25\x6e\x49\xe3\x12\xb3\x3c\x86\x81\x6f\x6c\xff\x67\x47\x82\x72\x2b\xc9\x5f\x02\x01\x7e\x32\xbb\x2e\x45\xfb\x69\xcf\x9f\xf6\x7c\x40\xc7\xbe\x93\x3d\x97\xfb\x44\xff\x3e\x2e\xfd\x16\xff\xc9\xcc\xbe\x1a\x81\x4f\xbb\xff\xb4\xfb\x03\x4a\xf6\x9d\xec\x7e\x18\x81\x40\x9a\x7a\x93\x94\x82\x59\x92\x1e\xdf\x4b\xff\x1d\x00\x60\x8b\xe2\x0f\x86\x82\x2c\xf0\x7e\xcb\x40\x0f\x9c\x9b\x1c\xdd\x2e\xfc\x21\x6f\x64\xbc\x4c\x3c\xeb\xe2\xf7\xb3\x53\xd2\xa9\x3e\x67\xde\xc8\x7e\x7a\xcd\xfc\x3b\x30\x6d\x17\xda\xb4\xb5\x2b\x9f\x75\x4e\x0e\x74\xf5\xf9\xf9\xba\xe2\x81\x20\xfd\x18\xe6\x8f\x6b\xf9\x9f\x22\x32\xdd\x03\x8b\x4f\x5f\xf5\xe9\xab\x0e\x68\xdb\x77\xf2\x55\xd2\xc6\x0e\xfc\xbf\x46\xa0\xfa\x93\xd9\xf7\x96\x80\x3f\x6d\xfb\xd3\xb6\x0f\x68\xda\xb1\x93\x52\x1f\x78\xfd\xdc\x05\x7a\x77\xf2\x32\xbc\xf7\x9f\x31\x7a\xe1\xff\x87\x9e\x0f\x32\x6d\xc7\x79\x20\xcc\x87\xdb\x5a\xed\xb1\x71\x5b\x7f\x04\x93\x5b\xcb\xa9\x13\xb7\x93\x6f\xd8\xb7\x89\x65\x3e\xe2\x26\x78\xb8\xf0\x7c\xd0\x79\xa9\xff\x99\xce\x06\x7d\x88\x22\xde\xd0\x48\xc9\xca\x05\xc0\xed\xe3\x6e\x7f\x5b\x8d\xab\x3b\xe4\x83\x45\x3e\x5a\xb7\xb8\x53\x9f\xdc\xd6\x1f\x1e\x1f\x6e\x4d\x82\xc4\x6f\xed\x6f\x0f\x8f\xb5\xba\x43\xe0\xc4\x9b\x34\x6e\xf2\xb7\xd2\xb8\x3f\xc3\x21\xd1\xcb\x51\xf8\xf3\x68\xe8\x9f\xfc\x68\xe8\x5f\x0b\xfa\xff\xac\x4b\xee\x27\xd1\x61\xe3\xfc\xe7\xdb\x41\x61\xf7\x58\xe8\x6e\x4f\x36\x1a\xf9\x52\x79\xbf\x36\x2f\x5d\xa1\xc2\xaf\x37\xe9\xdd\xd6\x7e\x9c\x1d\xbf\xa6\x9f\x3f\xd4\x66\x2d\x30\x01\x13\x13\xc3\x6f\x09\x93\x20\x6f\xeb\x38\xf9\x70\xfb\x58\x33\x1f\x6f\x89\x07\x62\x32\xa9\xd5\x6c\x50\xc3\xeb\x7f\x4b\xe7\xf9\xa1\x1b\xb7\x2e\x1b\xf6\x63\xf6\xf9\x8f\xe2\xef\xdf\xff\xf1\x7f\x01\x00\x00\xff\xff\x7f\x52\x2c\xe1\x77\xa8\x00\x00")
+var _rpProductionJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x73\xe2\xc8\x96\xf6\xf7\xfb\x2b\x1c\x7e\x27\xc2\x5d\xef\x94\x6d\x49\x40\xd9\xba\x11\xf7\x03\x08\x04\x12\x20\xd0\x2e\x74\xe7\x46\x87\x96\x44\xc8\x4a\x2d\xad\x05\x0c\x13\xfd\xdf\x27\x52\x0b\x8b\x59\xbd\x54\x75\x75\xb7\xe9\x88\x6a\x8c\x32\x4f\x66\x9e\x3c\xe7\x39\x4f\xae\xfa\xdf\x7f\x5c\x5d\x5d\x5d\x5d\xff\x57\x62\xcd\x80\x6f\x5c\xff\xf3\xea\x7a\x96\xa6\x51\xf2\xcf\xfb\xfb\xe2\x97\x3b\xdf\x08\x0c\x07\xf8\x20\x48\xef\x8c\x55\x16\x83\x3b\x2b\xf4\xcb\x67\xc9\x3d\x81\xe1\x8d\x5b\x0c\xbf\xc5\xf0\x7b\x1b\x44\x30\x5c\xa2\x74\x12\xf0\x23\x68\xa4\xe0\xee\x29\x09\x83\xff\x77\xfd\xb5\x28\xc1\x0a\x83\x14\x04\xa9\x02\xe2\xc4\x0d\x03\x54\x10\x7e\x87\xa1\xff\xaa\x04\x91\x11\x1b\x3e\x48\x41\x9c\x5c\xff\xf3\xaa\xa8\x56\xfe\xbb\x61\xc5\x02\x48\xc2\x2c\xb6\x00\x63\xef\x3c\xca\x1f\xa7\xcb\x08\x20\x69\x49\x1a\xbb\x81\x73\xbd\x7e\xf8\xfb\xd7\x2d\x11\xb6\xef\x06\xcd\xc8\xa5\x8c\x56\x16\xd8\x10\xbc\x53\x0a\x74\x41\x90\x52\x20\x4e\xa9\xd0\xf7\xc3\x80\x33\xfc\x37\x4a\xb4\x8d\xd4\x30\x8d\x04\x34\x2d\x2b\xcc\x82\xf4\x1d\x82\x42\xdf\x70\xdf\x51\x11\xf0\x9c\xc6\x06\x15\x26\x7e\x98\xb4\x5b\xcc\x38\x39\x2b\xe5\xeb\xee\x53\x1b\x4c\x8d\x0c\xa6\x8a\x01\xb3\x3c\xd5\xe1\x52\xa6\x91\x08\xe2\xb9\x6b\x81\x71\xec\x06\x96\x1b\x19\xf0\xad\x1d\x3a\xcd\x20\x6c\xe7\x06\x77\x3c\xbf\x19\x86\xf0\x4c\x3d\xa7\x06\x4c\xc0\xc1\x02\x3c\xb0\x9c\xa3\x94\xe3\x18\x4c\xdd\xe7\xb7\x55\xd2\xb7\x7d\x3a\xce\xad\xde\x96\x63\xf8\x56\x19\x89\x4d\x85\xc1\xd4\x75\x36\x8e\xf3\x46\x31\x9d\x60\xee\xc6\x61\x80\x3c\xf4\x6d\x42\xe2\x88\xf1\x0d\xe7\x8d\x16\x16\x47\xc3\xd0\x3e\x9f\xf7\x4d\x76\x15\x7f\x98\x5d\x25\xc9\x6c\x9c\x99\xd0\xb5\xfa\xe0\x84\x65\x9d\x94\x90\x86\xb1\xe1\xbc\xdf\xa3\x93\xcc\x4c\xac\xd8\x8d\x52\x37\x0c\x2a\xf8\xeb\xc6\x61\x16\xbd\x5d\xe4\xdc\x17\xdd\xd5\xbb\xbb\x40\x4c\x8d\xc0\x36\x62\xfb\xd7\x36\x91\xfc\x3a\xaf\x1d\x2b\x2a\x49\x5e\x59\xd1\x7f\x6c\xc9\xb8\x8e\xcb\x16\x23\x20\xfa\xf7\x3a\xcd\x0b\x51\x89\x97\xed\xc9\xcf\x1f\x04\x45\xc9\xeb\xaa\x5e\xef\x24\xf9\xfd\x45\x03\xa3\x38\x8c\x40\x9c\xba\x60\x1f\xf5\x8a\xe7\xb9\x41\x30\xe3\x26\x84\xa1\x65\xa0\xfe\x18\x82\x74\x16\xda\x65\x09\xa9\x6b\x9d\x96\x5f\xd5\x26\x8e\x6e\x23\x37\x7a\xa9\xde\x4a\x1f\x43\xd7\x8a\xc3\x24\x9c\xa6\x77\x1c\x48\x17\x61\xec\xdd\xaf\xcb\xb5\xed\x18\x24\x09\x48\x5e\x66\xad\xaa\x83\xb2\xff\x3b\xde\xb6\x91\x5f\xbe\xdc\x55\x0f\xff\xf3\x32\x97\x15\x06\xb6\xbb\xce\xb6\x09\xba\xbf\xdc\x6c\x40\xf5\xe6\xcb\x5e\x36\x23\x72\xb7\x42\x37\x81\xe1\xe4\x2d\xf6\x70\x8b\xe1\x07\xfb\xff\x8f\xe9\xa8\x69\x09\xb6\xcc\xb8\x40\xcc\x2c\xce\x35\xb0\x6b\x43\xdb\x9f\x7d\x19\x97\x96\xb5\x9b\x76\xb7\xa3\xce\x66\xc8\x33\xb9\xf6\x4e\xb7\x31\xf6\x2f\x37\x17\x98\xc0\xcd\xd7\xab\x9b\xc2\x8e\xf6\xbb\xe8\x60\x31\xa9\xe1\xa0\x0a\x05\x19\x84\x27\x13\xff\x7e\xf4\xe9\xef\xc7\x4b\xd9\x36\xed\x4a\xf9\xd7\x07\x53\xef\x8b\xff\xcf\xbe\xd8\x6b\xd3\xb0\x3c\x10\xd8\x65\x6b\xc7\x61\x08\xdf\xd4\x77\x5b\xb5\x2a\x25\xbe\xa7\x52\x30\x34\xec\x96\x01\x8d\xc0\x72\x03\x47\xc8\x20\xf8\xee\xf6\x74\xc4\x8e\x3f\xd0\xae\x36\x6d\x02\x71\x72\x7f\xcc\x6f\x4a\x63\x83\x66\xf9\xa5\x4a\x87\x4c\xef\xb4\x31\x9d\x36\xcc\x03\xfd\xfc\xdd\xda\x76\xc0\xa4\x5e\x36\xab\x4c\xf2\xee\x56\x45\x71\x68\xee\x07\xbc\x8f\x6a\x48\x2e\x7d\xaf\xee\xf9\xaf\x1f\x51\xf3\x34\xb4\xf2\x5e\xb8\x96\xac\x97\x21\x6a\x2f\x39\xaa\x58\xdb\x45\x01\xdc\xcc\xaa\x40\xd2\x2e\x58\xc2\xb9\xac\x95\x09\x8d\xc3\x18\x91\xd0\x7a\xbd\x76\x99\xa9\x6c\xd2\xbf\x17\xa7\xa0\x19\x67\x10\xbc\x07\x10\x8a\x9e\xf8\xee\x41\x65\xab\x4f\x7a\x68\x44\x7e\x4e\xb5\xd1\xa5\x2a\x0d\x32\xdf\x04\xf1\x68\x3a\xae\xda\x41\x9c\xc9\x10\x83\xdf\x32\x90\xa4\x63\x23\x9d\xa1\xda\xdc\xcf\x80\x01\xd3\xd9\xea\x3e\x06\x86\xbd\x3c\x6e\x79\x17\x76\x48\xe1\x36\x97\xf6\xc7\xa5\x4c\x0b\x9a\x97\x13\xad\x1d\x47\xfb\x39\x49\xd6\x1e\x27\x8f\x40\x60\x27\xa3\xe0\xa0\x15\xbe\x93\x55\xfc\xe3\xb0\xc2\xdf\x41\xef\x76\x14\x50\x8c\x42\x0e\xd3\x97\xeb\xd4\x05\xf1\x0e\x21\x3c\x90\xc6\x32\x22\xc3\x72\x53\x34\x3e\xab\xbd\x8b\x2f\x66\x91\x13\x1b\x36\x18\x87\xd0\xb5\xf6\x47\x7b\xeb\x64\x7e\x31\x6e\xbd\x1e\x1a\x41\x66\xc0\x7d\x4b\x3d\x60\xe7\xd7\x73\x37\x4e\x33\x03\x0e\x0d\x6b\xe6\x06\x60\x1c\x87\x53\xf7\xc0\xac\xd3\x3a\x79\x98\x9c\x4b\x52\xb4\x3c\xf4\xa3\x2c\x05\x31\x1a\x59\xad\x27\x26\xae\xff\x6d\x85\x81\x65\xa4\xbf\xa0\x2e\xbc\xf9\x7a\xb5\xab\xeb\x62\x18\x76\xf3\xe5\xeb\xd5\xcd\xed\x69\xca\x58\x4c\x6f\xc9\x09\x88\xab\x6e\xb3\x60\x98\xd9\xb7\x59\x02\xe2\x53\xd9\xa0\x1b\x64\xcf\xaf\x23\x2a\xd7\xb6\x9b\x18\x26\x04\x63\x23\x49\x16\x61\x6c\x37\xb3\x74\x06\x82\xd4\x5d\x7b\x5a\x1a\x67\xe0\x0c\x28\x25\xc9\xec\xb2\x58\x1b\x55\xe3\xf9\xe3\x90\xfd\xf2\x73\x5e\xea\x46\xfa\x1a\x14\x43\x1f\xdc\x6f\x34\x76\x7f\x97\x24\xb3\x7b\x23\x4b\x67\x61\xec\xae\x80\xfd\xab\x87\x2a\x70\x9e\xb0\xaf\x05\x7b\x60\xd9\x36\x52\x63\xcf\x7d\xb6\x67\x28\xce\x06\xfe\xea\x73\x9c\xdd\x57\x9f\xff\xbc\x75\x74\x70\x18\xb8\x0f\x37\xb4\x9a\x1c\xb9\xc8\xd8\x5d\xdf\x70\x80\x00\xa6\x20\x06\x81\x75\x9e\x57\x15\xfd\x9c\xcc\x0a\xfc\x10\x80\xdd\x33\xce\xb2\x91\x70\x3a\x2d\x93\xf7\x3a\x83\x73\x89\x0b\x94\xbb\x7e\xb8\x1d\x28\xc3\x73\x69\xe7\x1b\x10\x7f\xb8\x23\xef\x08\x8c\xc0\x70\x0c\xc3\xf1\x6f\x6f\x8b\x96\x61\xd2\x76\x13\xef\xbc\x0a\xac\x18\x18\x29\x18\x45\x55\xe0\xa1\xe3\xd0\x2f\xa6\xec\xce\xd4\xb7\x98\xe3\xb7\x2f\x2a\xe5\x6a\x7f\x96\x4b\x2a\x43\xeb\x38\x06\xbe\x9b\xf9\xbf\x0e\x04\xf1\x0c\x21\xfd\x20\x7b\x0a\x8a\x88\x76\x91\x3d\x15\xac\x65\x7c\x11\x49\xff\x91\x04\xfd\x24\x4d\x2a\x4a\x62\x82\x14\xc4\x53\xc3\x02\x17\xce\x6b\x54\x9f\x0b\x3a\x72\x8b\x32\xa1\x60\x71\x1b\xb8\xd6\x25\xd3\x0a\xaf\x60\xb2\x5b\x79\x5c\xdf\x88\x97\x17\xc1\xfb\x3a\x93\x1b\xbd\xb2\xcd\xdb\x9f\xcb\x71\xfc\xea\x90\x2e\xdc\xc8\xca\xcb\x7e\x05\x6c\x5f\xbd\x51\x39\x3b\xf9\x93\xcc\x0c\xc0\xfe\x1c\xfd\xc5\xf9\x2f\x32\xde\x92\xa1\x94\x7f\x26\xf7\x45\xa1\x95\xfd\xce\x03\x90\x96\x5f\x8b\x07\x17\x87\x9a\xed\xcf\x99\x71\xe7\xc1\xca\xbf\xc5\x4a\x76\x05\xec\xb2\xdb\xd7\x4f\xa1\x1c\x94\xfa\xd2\x36\x22\x37\xfa\x31\xfa\xd8\x06\x99\xd6\x2b\xe6\xc7\xce\x7d\xde\xa6\x87\xab\x3f\x7e\x1a\xe6\xd8\xe7\x3c\xc7\x79\xf9\x39\xcd\x79\xde\x2e\xff\xb2\x94\xe7\x4b\x3f\x2d\xe7\xf8\xd3\xc3\x92\x8f\xc5\x50\xdb\x35\x9c\x20\x4c\x52\xd7\xba\x6c\x10\x62\x86\x61\xda\xde\xe4\x39\x1f\x4b\x41\x80\xb8\xbe\x7d\x21\xad\x2f\x88\x85\x1c\xbb\x3b\x43\x9b\x6a\x4f\xc2\x8b\xf1\xcd\xfe\x62\x5b\x3e\xd2\xb9\x33\x61\x68\xde\x59\x61\x0c\xee\x16\x6e\x60\x87\x8b\xe4\x2e\x00\xe9\xfd\xe9\x30\xfc\x2a\xa5\x81\xe7\x14\x04\x88\xe2\x5d\xa4\xb2\x75\xea\xef\x12\xb2\xad\xe4\x1c\xbf\xbb\x7a\x73\xc8\xde\xe6\xd4\x1b\x1f\x6f\xe6\xfb\x40\x3a\x9b\x56\x5d\x18\xcc\xab\x29\x18\x2a\x4b\xd2\xd0\x17\xf3\xe5\xcd\xd7\xe4\xed\x19\x81\x0d\x41\xbc\x3d\x45\xb2\xde\x3e\x72\x56\x80\x91\xa5\xa1\x5c\x8c\xf8\x87\x6e\x10\x6e\x49\x79\x05\x1d\x49\x40\x9a\xba\x41\xbe\xa4\xf2\xbf\x17\xa2\x79\x3e\x93\x07\xac\x14\xd8\xe2\x56\xe6\xcb\x07\x82\xc5\x2a\x70\xee\x0d\xa6\x91\x80\x6f\xf5\x5f\x4a\xa7\x28\xfe\x92\x42\x31\x5f\x49\xfd\xe5\xc6\x22\x14\x8c\xa1\x70\x08\x9a\x61\xff\xe6\xcb\xd7\x9b\x61\x7b\x48\x0b\x23\x4e\xea\x70\x6d\x59\x18\xfc\xeb\xbf\xca\x0c\x57\xb7\xf6\xd5\xff\x64\x18\x56\xb3\xb6\xff\xbd\xb9\xb9\xf9\x5a\x8a\xdf\x76\xb0\xdd\x2d\x0c\x37\x5f\xbe\x7c\xbd\xb9\xb9\xf9\xf2\x3f\xc1\x0d\x12\x2f\xb6\xa9\x11\x47\x33\x5d\xa5\x23\x88\xcc\x88\x7b\x6b\x09\x2f\x36\x38\xec\x15\xd2\xe1\x14\x46\x18\x71\xc3\x0e\x27\xbd\xbd\x88\xad\xcd\x0f\x3b\x05\x34\x29\x41\xe8\x88\x23\x59\xa0\x3a\x4c\xfb\x6d\xe2\x77\xf6\x27\xed\x08\x6f\x8f\x86\x4d\x86\xe3\x9a\xc3\xce\xdb\x24\x6f\x76\xf5\xec\x88\x15\xc6\xcc\xb0\xd9\x7d\xa3\xcc\x72\x13\xc7\x0b\x81\xc3\x51\xfb\xcd\xf2\x86\xa1\xbd\x2b\xae\xd9\x1e\x32\x5c\x73\xcc\x50\x03\xa6\xc3\x49\x54\x47\x90\xa8\xd1\x70\x38\x7a\x87\x22\x4e\xed\xbc\xda\xd5\x78\x53\x6a\xb6\x9a\x62\xa7\x49\x51\x23\x99\x93\xde\xa1\xfa\xfd\x9d\x59\x3b\x05\xf5\x3b\x13\xa5\x29\x0f\xa4\xb1\xd0\xa1\x19\xed\x6d\x65\xec\xee\x31\x3a\xac\xc2\x66\x4b\xe6\xda\x83\xce\xbf\x90\x88\x83\x1a\x29\x77\xb4\xdd\xe4\x99\x4b\x9f\x19\x16\xf6\x71\x73\x73\xef\x80\x00\xcc\x0d\xdf\xf6\xff\xe9\x1b\x49\x0a\xe2\x5f\x1b\x78\x99\x6a\x30\xa2\x9a\xd2\xab\xbc\xf6\xd8\xe4\xf7\x56\xb5\x45\xb9\x25\x52\x02\x33\x46\x82\x5f\xe3\x4e\xdb\x9b\x5d\x7e\xf9\x72\xb7\xfd\x27\x63\x6f\x1b\x6a\xe9\xaa\x5d\x61\x24\x8f\x5f\xd7\xb9\x2f\x6b\x8f\xa2\xe8\x96\x64\xf4\xcf\x4b\x40\xa5\x02\x88\x9b\x62\x33\x05\x62\x0b\xb7\xba\xc2\xcc\xee\xca\xce\x40\x73\x1c\x05\xa3\x87\x86\xda\xc0\x41\x87\x0e\x74\xb5\x81\x51\x4e\x94\xd8\xbe\x52\xb7\xbb\x4a\xa6\x53\xcd\xd4\xa4\x9a\x31\x27\x35\xa1\x00\x59\x5a\x10\x9b\x73\xbd\xab\x10\x83\x1a\x3b\x37\x6b\x02\xa1\x2f\xc9\xa5\x49\x90\x98\xd9\x9b\xf4\x41\x57\x5f\x69\x84\xbd\x34\x6b\xb6\x6f\x2d\x9b\xf3\x43\x72\x86\x52\x73\xc1\xca\xba\x28\xc8\xb2\x33\x20\x04\x68\xbb\x45\x7e\xdb\xb7\xe6\xb6\x4f\x2f\x0f\xc9\x41\xbf\x53\x4e\xf8\xc4\x74\x69\xc2\x24\xa0\xc7\x50\x2c\xb4\x02\x76\x6e\x3d\x85\x8e\xde\x65\x70\xa6\xab\x2c\x2d\x9f\x5c\xf6\x29\x6c\x35\x6c\x7b\xc4\x48\xf4\x1c\x3d\x60\xe7\xa6\xd8\xf2\x26\xbe\x92\xd9\x2e\xf6\xdf\x66\xad\x05\xcd\xa7\xd0\xe1\x3d\x81\x1a\xb6\x9b\x8d\xa1\xd8\xea\xf0\x90\x54\x05\x85\x95\x44\x99\x1c\x69\x18\xce\xca\x18\xde\x52\x3a\x1c\x33\x72\x5b\x9d\x89\x26\xcc\x26\x3e\xbd\xd2\xc5\x16\x34\x03\x3d\xb2\x7c\x32\x33\x55\x25\xb3\xa9\x16\xa1\x6b\xec\xca\x50\xc9\x8c\xe9\xe2\x91\x45\xe0\x33\xbb\xcb\x85\x8c\x13\x2d\x91\x6e\x75\xb7\xa8\xef\x80\x78\x8e\x26\x2e\xb9\xb4\xba\xd8\x5c\xc3\x49\x6f\xe2\x86\x7d\x2a\x60\x17\x28\xcd\x40\x85\xa9\xd5\x25\x97\x36\xd5\x0a\xed\x9e\xb0\xb0\x56\xe1\x7c\x40\x08\xc9\xc0\xd7\xa1\xde\x25\x97\x13\xad\xb5\x34\x89\x08\x4e\x6a\x7c\x66\xd6\xd8\x60\x50\x6b\xe1\x13\x97\x84\x56\x57\x49\x06\x38\xcb\x4b\x22\xde\x93\x3b\x56\x2a\x62\x8a\x3e\x90\x15\x5e\x90\x17\x29\xb7\x88\x50\x59\xce\x40\xc4\x23\x53\x6b\xcd\xad\x80\x77\x8c\x9e\x80\x59\xbd\xe1\xb7\xc1\x92\x5c\x4c\x54\x2e\x9e\xa8\x36\xb4\x96\x8d\xd4\x50\xb9\xa5\x59\xe3\xe6\x7a\xc0\x67\x13\x82\x4c\x07\x44\x0a\x81\x36\x9c\x9b\x2a\x7c\xb2\x7c\x72\x65\x12\x3a\x36\xf0\xe9\xd5\xe4\x72\x99\xbe\xd9\x53\xa0\x19\x08\xae\xa1\xf1\x99\xa1\x3e\xce\x75\xff\x19\x47\xb6\x34\xf1\x21\x36\xf0\x53\x08\xf8\xb0\xaf\xfb\xe4\x92\xe9\xd2\x98\xdd\x55\x52\xab\xc7\x3b\x86\x5a\x77\xc0\xaa\x93\x0d\x9e\x14\x72\xb4\x6c\x79\xe6\x22\x74\x98\xde\xda\x46\x23\x33\xe0\xb0\x89\xfa\x9c\x30\xdd\x19\x66\xf7\x5a\xab\x91\xfb\x38\xd7\xbb\x8b\x4c\xf7\x15\xcf\xac\xb1\x33\xab\xc7\xce\x0d\x5f\x79\xb2\xa9\xc6\xdc\xf2\xad\xb9\xd5\x53\xdc\x01\xa1\x2c\x74\x75\x31\xd7\xb5\x16\x34\x29\x7c\xa9\xab\xcf\x70\xa2\x71\x70\xa0\x3e\xcf\xec\xae\xb2\xb2\x29\xac\x36\xf0\x1b\xf3\x89\xc6\x3e\x19\x54\x23\x6f\x1f\xeb\x4e\x9c\x49\xc0\xc2\x89\x9a\xf4\x19\xaa\x15\xe9\x6e\xcb\x54\x97\x4d\x0f\x10\x55\x5d\x05\x92\xa1\xf0\xc4\xa6\x9a\x38\x43\xe3\xf6\x68\xd9\xc2\x8c\xae\x92\x31\x3d\x2e\xd1\x55\x65\xc1\xb4\x3b\x8b\xd1\xb2\x05\xcd\x1e\x07\x99\xae\x52\x37\x34\xde\x19\x4a\x89\xa3\xfb\x5e\x5f\xef\x92\x99\xce\x87\xfd\x09\x41\x63\x4c\xbb\x3e\xd7\x35\xe1\x69\x50\x43\x6d\x6c\x2c\x75\xa4\xd3\x65\xc3\x1b\x10\xf4\x37\x5b\x63\xe1\x20\x60\xa1\xd5\x7d\x74\xc6\xed\x45\x20\xc8\x64\x97\x5d\x44\xe6\x44\x8b\x70\xcb\x97\xd3\x09\xf1\x1c\x69\x7c\x94\x4d\x54\x1c\x8e\xd5\x32\xbd\xca\x25\x06\x1f\xb9\xa8\x7d\xb6\xc6\x26\x63\x75\xa3\x27\xab\x4b\x3f\x19\x04\x1d\xe8\xda\x30\xdb\xed\x57\x6e\x6e\x8a\x64\xc3\x56\xf1\xb2\x7c\x72\x06\x02\x65\xa9\x8b\xf8\x93\xd9\xf5\xfa\xba\xda\x98\x4d\xfc\x67\xa8\xb7\xf1\x86\xae\x0d\xfb\x7a\xad\x15\x4c\x88\x19\x9c\x10\x09\x09\x54\x65\x45\x39\x55\x9d\x94\x27\xb3\xc6\xc2\x97\x75\x9a\x10\xe4\x52\xff\xa8\x3a\xa9\xdc\xdc\xf2\xe5\x93\x75\x32\xfd\xc7\x3e\xd2\x15\xe5\x44\x4f\x13\x8d\x77\xc6\x2e\x09\xed\xee\x70\x0e\x34\x25\x2d\xf4\x49\xae\x06\x3e\x3f\xb7\xbb\x7c\x8a\x6c\xd5\x0c\xf8\x34\xb7\xc9\x03\xba\x7e\x99\x66\xdd\x36\x4d\xf0\x06\x6a\x81\x8d\x03\x95\x8d\xec\xe6\xf9\xf6\xed\xda\x3f\x9c\x0f\x08\x0e\xf9\xc7\xdc\x5a\x3e\xd6\x28\x5f\xc9\x26\x2a\x9b\xe8\x2a\x5f\xe8\xd4\xb7\x17\x3a\xc1\x85\xba\xca\xc5\x63\x0d\x42\x6b\x11\xd1\x12\x36\xe9\x53\xbe\x3e\xb7\xdc\xd6\xcc\xee\x09\xd0\xd4\x5a\x18\xd3\x85\x19\xd3\x4b\x9e\x07\x6e\x1d\x9f\x22\xfb\xea\x3e\xf6\x51\x3b\x19\x0a\x6f\xa0\x67\x56\x4d\x98\x99\xdd\x85\x33\xd1\xa2\x95\xae\x0e\x91\xcd\xcc\x4c\x95\x26\x98\x2e\xfd\xcd\x22\x94\xa7\x81\x8a\xcf\x4d\x1f\x62\x66\x8d\x71\xb6\xed\x6a\x20\x31\xd9\x50\x6a\x66\x43\xb1\x55\xd9\x42\xaa\xf7\x38\x0f\xe5\xcb\xed\x4c\xe3\xe0\xa4\xa6\x2c\x0d\x4d\x68\x30\x5d\x61\x3e\x21\x52\x68\xb9\x2d\x4c\xa7\xf0\x99\x4e\x20\x4c\xc4\x91\xdf\xff\x10\x3f\xb2\x82\x16\x6a\x2f\x64\x28\x3e\x2c\xbf\x3f\x4f\xc4\xd6\x23\xd3\xb5\x97\xba\xd6\x74\x34\x9f\x76\xad\x80\x4f\xfb\xfc\xae\x3d\x58\x35\xb8\x9a\xd4\x10\xc6\xf2\xf3\x61\xbb\x93\xea\x5d\xb8\xca\xfb\x00\xd9\x7d\x8d\x85\xb9\x0d\xfa\x93\x6d\x7b\x88\x75\x8d\xcd\x74\x75\x91\xe5\x36\xad\x90\x8b\x89\x26\x60\xe8\x37\xa6\x8d\x39\x53\x8a\x74\x0d\xb5\x3e\xb7\x7b\x2c\xae\xf3\x45\x7f\x55\x65\x30\x14\x96\xa2\xef\xa8\xcd\x94\x13\xf9\x86\xc6\x42\x9b\xa0\x13\x93\xc2\x9f\x4c\x95\x47\x78\x3a\xd3\xbb\x7c\x11\x03\xda\x18\xc6\xb5\x87\x73\xbb\xcb\x2d\xf2\x7c\x5d\x65\x69\xaa\x74\x56\xc6\xe1\x9d\x36\xec\xd9\x70\xed\x85\x5d\x52\x8d\x27\x93\x68\xf8\x4c\x7b\xf1\xc8\x62\xca\x58\x70\xad\xbe\x8a\xc1\x91\x4c\x2b\xb2\xc6\x87\xac\xe4\xd3\xa9\x2e\xb6\x56\x40\xe3\x30\x5d\xc5\x3d\xca\x81\xf2\x44\xb5\x1c\xc3\x27\x71\xcb\x6f\xcc\xcc\x2e\xdf\xa7\x14\xae\x61\xd5\x04\x68\xaa\xc2\x54\xf0\x61\x62\x77\x95\x25\x43\x93\x6d\x09\xc3\xb9\xb1\x4a\x2f\xcd\x45\xd8\x57\x31\x9d\x95\x68\x81\x96\x21\xd6\xa7\xe4\xc6\xcc\x54\x65\xc7\x54\x49\xcf\x50\xf5\x06\xe5\x40\x6e\xa2\x09\x4f\x06\xd5\xfa\xcd\xac\x29\x4b\xd3\xa7\x13\xbd\x19\xb2\xb2\xaf\xa4\x66\x4d\x87\x5a\xcd\x8e\xcc\xae\xf0\x34\xd1\x58\x8f\xa1\x1f\xfb\x94\xc2\x42\x53\x25\x09\x5d\x6c\xc9\xa2\x8c\xd3\x32\x2e\xb4\x24\xa5\xd9\xa7\x60\x3a\x56\x14\x81\x57\x14\xc1\xa6\x1c\x38\x42\x7e\xc8\x74\xf5\xb9\x15\xd8\x33\xcb\x47\xf5\x2c\xe2\xd1\xf0\xc9\x5b\x0e\x57\xcd\x0a\x03\x66\xc0\x6d\x25\x26\x61\x47\xa6\xdb\x4c\x0d\x3e\xff\x7b\x36\x21\xb8\xb9\xad\x36\x30\xa6\xc7\x41\x9b\x6a\xa6\xd6\xb2\xe9\xb2\x34\xa7\xf0\x90\x6b\xcb\x1e\xe4\x95\x0e\x1c\x4b\x1e\xec\x30\x4e\xd8\xaf\xfa\x2d\xef\xc7\x1e\x87\x4d\x34\x16\xdb\xd8\x7c\x63\xa5\x6b\x2c\x61\xa8\x1c\xa4\x7c\xfa\x1b\xd3\xa5\x9f\xac\xad\xf2\x06\x6a\xa1\x0b\xc6\xe5\x43\x8b\x50\xbc\xc2\x4e\xed\xd5\x94\xaa\xff\x36\xa8\x3d\x3f\xb2\xcb\xe6\xe3\xb8\xbd\x70\xd9\x0e\xdd\x96\x21\x4b\xcb\x18\xa9\xc8\x1e\x47\x8b\x32\xef\xf6\x45\xa6\x4f\x79\x78\x47\x92\x21\xc7\xcb\x36\x3d\x16\x19\x0f\xe0\x2c\x2f\xca\x78\x4b\xc0\x64\xc8\x8a\x8f\xbf\x4d\xc5\x47\x0f\x60\x9b\x34\xcc\x72\xf8\xdb\xa0\x86\xb9\x94\xbf\xf6\xc9\x85\x8d\xe2\x25\xc5\x78\x92\x2c\x70\x65\xde\x83\xcf\x65\xd8\x62\x25\x99\xee\x09\xa8\xdc\x0b\x70\x86\xa1\x5a\x48\x97\xb1\xae\x41\x62\xa2\x29\x89\x4d\xb5\x56\xba\xca\x2d\x75\x8d\x77\xf4\x2e\x59\x33\xfd\xe7\xf9\xa4\xb0\x6d\xdf\x50\x9f\x21\x43\x15\x36\x6b\xaa\x42\x3a\x08\x5a\xb0\xe4\x3d\x88\xbb\x6d\x38\xcf\x52\x18\x08\x0a\x54\x79\x45\x19\x2a\x74\x4b\x14\x64\x9d\x55\x29\x7c\x65\xfb\xc3\xcc\xf6\x69\xdc\xec\xf1\x59\x89\x53\x99\xe9\x2b\xd8\xa0\x86\x70\x88\x85\x76\x6f\x38\xb7\x82\x66\x8a\x64\x33\x6e\xd3\x67\xdd\x96\x6b\xf9\xca\xcc\x40\xfc\xa1\x0b\x7d\x86\x4e\x4d\x86\x12\x1e\x72\x7f\x55\xf1\x85\xdd\xc3\x9c\x81\xfa\x8c\x31\x6d\xd9\xd1\x14\xec\x81\xe9\x09\xa1\xae\xd6\x1d\x8b\x78\x86\x08\x33\x86\x52\xf3\x81\xe9\x2a\x89\x45\xc8\x8e\xae\xcd\x22\x9b\x6a\x3e\x8f\x96\x2d\xdf\xe0\x23\xcf\x24\x1a\x90\xf2\xb9\x10\xd9\x37\xd3\x6e\x12\xc3\x76\xd3\x19\x10\x0a\x36\x59\x92\xa9\xde\xc5\x32\x0b\xf9\x78\xc0\x41\xc4\x6f\x0d\xb1\x99\x9a\xbe\xec\xb0\xab\x4e\x32\xc0\x94\x91\x40\xb5\xda\x82\xc2\xca\xa2\xac\xb3\x3c\x46\xcb\x82\xf8\xe8\x58\x94\xb5\x9f\xbf\xb0\xdb\xb7\xe8\x76\xa5\x53\x8d\x85\xae\x16\x1c\x4d\xa7\x9a\xee\x86\x9f\x3d\x7a\x88\x1f\x2a\x1e\xad\x48\xb4\xc0\xcb\x9e\xd2\x15\x15\x27\xb5\x6a\xfa\xd3\x20\xd0\x67\xb6\xfa\x8c\x38\x5e\x81\xef\x7e\x03\xda\x14\x59\x96\x29\xac\x06\x35\x76\x31\x50\x71\xcf\x22\x78\x37\x6f\x7b\xcd\x46\x18\xdd\xb0\x88\xe7\xb9\xbe\x8a\x10\x7e\x24\x26\xb1\xd5\x8e\x1e\xe7\xe5\x7d\xcc\x47\x4f\x46\x17\x9f\xeb\x54\x73\xc1\x3d\x35\x17\x07\xea\xd9\x2f\xfc\xe6\x79\xae\x13\x24\x6e\x37\xc3\xbe\xa9\xa6\x9e\xa1\x31\x95\xac\x99\xe5\x3f\xa6\x56\xd0\xec\xe7\xdc\x5b\x9a\x60\x0c\x85\x7b\x08\xcf\xc6\x14\xe3\xf1\xb9\x4d\x37\x5a\x72\x07\xb6\x79\x99\x55\x24\x4f\x18\x0a\x22\xb3\xc6\xc7\x89\xc6\xce\x07\x1a\xbb\x18\x10\xb4\x67\xaa\x30\x1b\xa8\xdc\x6c\xa0\xb2\xb8\xe9\x0b\x89\x2e\x16\xe5\x4f\x88\xd9\xdc\x26\xea\xce\x40\x61\x50\xbf\x2f\x86\xed\xf0\x79\xd8\xde\xd4\xb5\x92\x41\x39\x51\x6a\x10\x42\x64\xb9\xcd\x92\xb3\x55\xb8\xc8\xcf\x2b\x8c\x18\x10\xb9\x8e\x32\x8b\x50\x96\xb6\x0f\x9f\x74\xb1\xe1\x51\x3e\x37\xb3\xa9\xe6\x7f\x97\xed\x59\x63\xed\x3a\xbf\x58\xe9\x8b\x83\x56\xa0\x47\x13\x42\xce\x74\x8a\x9c\xdb\x3e\x1a\xc3\x40\x4f\x17\x0f\x60\x38\xae\x64\x86\x26\xd8\x94\x47\xfb\x08\x8f\xc7\x6a\x03\xda\x3d\x7b\x6e\xf9\x49\x6a\x12\x8d\xc4\x50\x1b\x70\x10\x08\x33\xcb\xb7\xa1\xdd\xac\xb8\xc3\x4e\x3d\x3c\x5d\x2d\xfb\xbc\xa8\xb3\x33\x6e\x3f\xe7\xe9\x24\x59\x90\x04\x9a\x14\x25\xec\x99\xd6\xf0\xd2\x07\xdb\x58\x31\x86\xa9\xb1\xb8\xe9\x96\xf5\x25\x04\xa8\x17\x3e\x59\xe5\x19\xcb\xb4\xc0\x4a\x58\x43\x1a\x8b\x4c\xca\xa3\xb1\x0f\xc2\x56\xb7\x65\xb1\x1d\xbc\x23\x63\xc2\x54\xf6\xc8\xa1\xa0\x90\x95\xed\xb9\x94\x13\x41\xd0\x2b\x70\x5b\xc6\xb9\xa1\x86\x71\xb4\x0c\x85\xa9\xe0\xc1\xa1\x20\x61\xa5\x9e\x5b\xb1\x21\xa2\xf1\xe4\x70\x3e\x41\x7a\xcd\xff\xdf\x49\x27\x81\x92\xe9\xdd\x67\x14\xa7\x97\xc8\x6e\x74\x6d\xb6\x30\x6b\x2c\xc6\x74\x70\x84\xdd\xb2\x84\xb3\xac\xe4\xd9\x53\x01\xe3\x24\x0d\x53\x46\x8a\x07\x45\x09\x6b\x70\x82\xdc\x90\xc7\xa2\xe5\xe5\x75\xee\xec\xfe\xce\x2e\x36\xf5\x91\x64\x72\x24\x2a\xc2\x58\xf6\xe0\x48\xc0\xc9\x1e\x8f\x73\x53\x5e\xe6\xda\x12\xae\x8c\x94\x36\xde\x92\x3d\x52\x94\x3b\xcf\x73\xbd\x36\x3c\x5d\x36\xce\xd2\x02\x06\xc7\xd2\x13\x16\xb0\x9d\xe7\x31\xf2\x7b\x34\xbe\x3c\x5b\x16\xa6\x88\x0a\x4d\xe6\x78\xb1\xa3\x8f\xca\xc6\x10\x4e\xf8\x4a\xbd\x1c\x37\x72\x12\xd6\x60\x95\x0e\x29\x8a\x72\xa3\xa7\x61\x76\x5b\xc6\x8b\xbc\x1a\x96\xd2\xaa\xac\xb3\x52\x47\x26\x0f\xf8\xe7\xc9\x3a\x48\x1e\xcd\x09\x0a\xc7\xf3\x32\x47\x8f\x65\x5a\x94\xd0\x58\xb3\x4b\x06\xd6\xf1\xba\xb7\x25\xac\xd1\x15\x65\x7b\xaa\x78\x8a\x28\xaf\xdb\x9d\xf7\x7f\xf5\x6c\x3d\xc6\x3e\xa1\x03\x45\xc6\x94\xa9\x80\x30\x53\xd1\x5b\x1a\xc6\x8d\x25\x4f\x67\x05\x9c\x94\x04\x85\x55\x45\x54\x1f\x4d\x58\xda\xaa\xdc\x3f\xaa\x03\x5c\xa0\x25\x8f\x1e\x29\xed\x8b\xf5\x9e\xdb\xfc\x18\xf9\xfa\x51\x99\xec\x58\xea\x28\x53\x51\x6e\x48\x4a\x87\x1e\xf1\x98\x4c\xb2\x4b\x3e\x34\xba\xe4\xca\xee\xe6\xb1\x3e\x62\x17\x07\xfd\x0d\xf9\x7d\xee\xc7\x86\x6a\xe5\x31\x10\xf9\x73\xce\x51\xf2\x18\xaf\x23\x1b\x94\x05\xb9\xd1\x51\x14\x76\x58\xda\x27\x27\x40\x76\x2c\x41\xd4\x0e\x41\x91\xbd\x45\xb0\xcb\x07\xac\xed\x98\x5e\x3c\x53\xb8\xb1\xa2\xb0\x6d\x41\x3e\x60\xef\x1d\xb2\xcd\x2b\xc8\x3f\xeb\xbb\x69\x15\xd4\x26\x99\x44\x18\x8b\xe4\x55\x1c\x24\xf7\x55\x19\x8e\x72\xfe\xe5\x71\x79\x79\xfd\xee\x6c\x6e\xd5\x84\x7c\x0c\xd4\x17\xad\x8a\x63\xad\x71\xb1\x98\xe7\x50\x30\x7b\xb1\xcf\xb5\x11\x3e\xea\x54\x85\x7f\x58\xc9\x03\xd6\x98\xb7\x33\xee\x52\xd4\x46\x64\xd3\x58\x9f\x57\x75\x4c\xd7\x18\x52\xef\x92\x4f\x06\xa1\x2c\xb7\xd2\xf7\x65\x5f\x79\xb6\x55\xb8\xd4\xb5\xe1\xc1\xe7\x14\x4c\xa5\x8a\x9b\x69\x7c\x44\xef\xcc\xd9\x74\xf4\xc8\xec\xae\xfd\x61\xaf\x6f\x28\x4f\xa9\xeb\x2a\x27\xd9\x5d\x7a\x69\xd3\xad\xa5\x2e\x61\xe9\xa0\xa6\xac\x2c\xb7\xe0\xf8\x55\x79\x4c\x8f\x45\xe3\x0d\x9f\xa1\x94\xd1\x4e\x1e\x84\x97\x1a\xb7\x1c\x10\x6c\x64\xba\xa4\x67\x12\x5c\xac\x6b\x8c\x63\x05\x4a\xc6\xd0\x8b\x3e\x43\x21\xee\xa3\x64\x76\x8f\x6d\x58\x5d\x32\x32\x03\xde\x29\xe5\xaf\x26\x3e\xcc\x06\x18\x0e\xed\x1e\x1b\x4d\x6a\x1c\x0d\x10\x07\x0b\xb8\xc8\x24\xea\x8e\xd6\x0c\x1d\x34\x26\xd8\xb2\x37\x87\x95\x9d\xf5\xef\x66\xce\xe7\x9b\x50\x72\x5b\x16\xe5\x36\x11\x07\x58\x9a\x62\xf9\x5d\xc5\x9c\xa1\x6f\x95\x69\x71\x62\x8f\x8f\x49\xe1\x1a\x5f\xcc\x22\x36\x6e\xa7\x25\x26\x1a\x83\x9e\xd7\x46\xee\xd6\xf7\x20\x2c\xd3\x08\x9c\xd0\xc1\x4b\xfe\x58\x96\x27\xa3\xbe\x10\xba\x87\xb9\x5f\x95\x46\x5f\x9a\x44\x03\x13\xd4\x86\xa7\x68\x6c\x52\xca\xe9\xca\x1e\x39\x52\x3a\xca\x48\xa0\x15\x51\xa2\xaa\xb4\x88\x23\xd8\x88\xb3\xb6\x4d\xa2\xb1\x32\x89\x67\x58\xe9\x12\x61\x92\xd4\x55\x08\x5d\x5d\x38\x0a\x41\x2f\x4d\x1f\x66\xfa\xb2\xcc\xa7\xb4\x96\x86\xa6\xcf\xec\xae\x32\xd0\x35\x78\xba\x3e\x0a\x37\xb7\x35\xf6\x49\x97\x95\xcc\xf6\x21\xaa\x5b\x8a\xc6\x52\x65\xbd\x24\x09\x57\x44\x1e\x53\x68\x09\xea\x2c\xaa\xa3\x84\xfc\x8c\x7a\x91\x57\x61\xe7\x66\x57\x76\x10\xe6\xbd\xf0\xb1\x4a\x9f\x12\x1a\x07\x4d\x08\x45\x44\x6d\x10\xd5\xc6\xca\xee\xd2\x19\xf2\x81\xfd\x3c\x0a\x2b\x41\x4e\xe6\xe5\x46\x5b\xe0\x23\x1a\x74\x95\x27\xb9\x26\xcc\xad\x63\xf6\x85\x9e\x51\x4d\x28\x39\x91\xa8\x6b\xc5\x58\x65\xac\xd2\x89\x4d\xd0\x0d\x6b\xb1\xf9\x4d\x26\x94\xa7\xb1\xd4\xe9\xcb\x35\x61\x66\x05\xc2\xd0\x50\xf1\xc8\xee\xc0\x0c\x71\x09\xdb\xa7\x93\xb1\x94\x8f\xb7\xd8\x6a\xbe\x4d\xe3\x23\x6d\xa2\x36\x30\x5d\x15\x28\x20\xe1\x29\xe2\x0d\x86\x88\xe3\x56\xee\x73\x27\x79\xc6\x8e\x6f\x55\x5c\x6a\x07\xfb\x14\xb2\xc5\x63\xdc\x58\x41\x38\x25\x17\xfc\x53\xf6\x15\x4f\xec\xd2\x98\x54\x6b\x41\x13\x72\xa1\xa1\xea\x98\x0c\x0b\x7c\xd2\xb0\x46\x4b\x92\x15\x49\xee\xd0\x6d\x41\xc2\x45\xb9\x19\xb5\x78\x9c\x9d\xca\x9e\x52\xf5\xcf\x54\x94\x79\x92\x5d\x0a\xe8\x77\x51\x58\x63\x22\xec\xb0\x8b\xa8\x95\xdb\x29\x24\x11\x67\x9c\xf2\xd8\x33\x8b\xf0\xb1\xe2\x1d\x3c\x46\x72\x52\x3e\xf7\x8b\xca\x90\x73\x19\x79\x7a\x8f\xe6\x45\x99\x1b\x8a\xa8\xbf\x3b\x79\xda\x7c\xfc\x2b\x61\x8d\x11\x2f\xe3\x34\xbb\x88\x3a\xbc\x22\xb4\x78\x8f\x96\x84\xad\xf6\x6c\xc9\xd9\x3c\x97\xe9\x36\x8f\x91\x8a\x04\x85\x75\x5e\x09\xc3\x5b\xa2\xdc\x28\xe2\xad\x84\xe2\x95\x30\x96\x64\x9a\x95\xbc\x3c\x7f\x40\x79\x29\xad\x2a\x7a\x4b\x91\x9f\xe5\x2d\x4e\x16\xb0\x9d\xcd\xef\x32\xcd\xd2\x82\x07\x27\xec\x22\x12\xe5\xce\x26\x46\x6c\xc6\x75\x56\x5f\x86\xad\xa9\x24\x93\x9d\xbc\x0c\x9a\xe5\xf3\xef\x1b\x1c\x3f\x8b\xd9\x6b\x3e\xfd\x13\xe2\xf6\x9a\xa7\xff\x10\xec\xde\xc4\x41\x86\x52\x98\xcd\xef\x15\x26\x6f\xb0\xda\xf2\xd7\x38\x0a\x99\xce\xae\xbd\x57\xf9\x74\xb1\x85\xf0\x65\x87\x6f\x6d\x3d\x7b\x8d\xcd\x6e\x95\x25\xb4\x94\x0e\x4d\xf1\x0a\x47\x6b\xd8\xda\xe6\x8a\x32\xd6\x31\x41\x76\x84\x0e\xc9\xf1\x32\x3c\x90\xff\x80\xcd\x51\x9b\x7c\x6b\x5b\xda\x92\xc5\xcb\x9c\x88\xf8\x6e\xc5\x21\x34\x0c\x76\xaa\x76\x98\x62\x73\xb9\xc6\x64\xad\xe9\x70\x6d\x7e\x35\x7a\x72\x30\xae\x3d\xdc\x8b\x49\x55\x5f\x8e\x5e\x8c\xe3\x2a\x59\xb6\xdb\x9c\xa3\xfe\xd8\x1e\x83\xad\xe7\xac\xda\xe1\xf1\x67\x55\xfd\xb5\x89\x33\xa8\xe9\x33\x0b\xc9\xef\x59\xdf\xb6\xbf\x83\x32\x76\x22\xff\x28\xb9\x55\x51\xbf\xde\xb6\x6d\x91\x8b\xb1\x48\xe2\x56\x8d\x99\xe7\xf1\x9a\x58\xcf\xa7\xac\xd0\x33\x86\xc2\x31\xa6\x3d\xcc\xe7\x06\x58\xb9\xde\x57\xba\x30\xd5\x55\x12\xb7\x69\x0e\x33\x6b\x2d\x49\x57\x87\xe4\x70\x35\x59\x0c\x9b\x3f\x31\x4e\x6f\xcd\x0d\x6f\x8d\x0d\xb9\x8d\x2d\xf1\x24\x5f\xcc\xfb\x8b\xba\x2a\x30\x13\x4d\x18\x5b\x5d\x25\x93\x89\x59\xa4\x07\x02\xc2\xe5\x3d\x9b\x1e\xcb\x2c\x25\xf1\x51\x5b\xa2\x15\x49\xe9\x28\xa2\x86\x5d\x8e\xff\x3c\xf1\x8c\xa3\xfe\xb4\x9c\xbd\xfc\x39\x8e\xca\x78\xab\x85\xf8\x38\xef\xb1\x1c\xe5\x9d\xb0\xfd\x02\x5f\xd7\xcf\xd7\x63\xba\xce\x4f\x88\xb5\x9b\x3e\xd8\x9a\x53\x68\x3e\x8e\x29\x1b\xf5\x47\x40\xc1\x54\x31\x8b\x75\x89\x96\x1e\x08\xd0\x7a\xc2\x2b\xbc\xda\xa4\xe7\x91\x3d\xd1\xb8\xa1\xb1\xd0\x5a\x1d\x7a\x1e\xf6\x55\xbc\xc2\x5f\xc5\xa6\xbc\x5d\xee\x23\xf8\x30\xd1\xd7\x63\x71\xae\x61\x11\xdc\xdc\xf4\xf5\x48\x2f\xe7\x66\x4c\x95\xcc\x0c\x4d\x98\x5b\xce\x9a\x9f\x20\x5b\xe5\x2d\x5f\x26\x07\x87\x7d\xa4\x5a\x17\x45\x3c\x65\x2b\x0f\x4f\x1e\xc1\x69\xdc\xdc\xf0\xd9\xd0\xac\x71\x58\xc5\x73\x45\x6a\xfd\x7b\x85\xc5\xa3\x35\x16\x6b\x6c\xba\x85\xa1\x47\x6d\xee\x44\x9a\x6d\xbb\x7a\x35\xae\x6e\xcd\xb5\x4d\x2b\x7b\x79\x89\xf7\x6b\xdb\xdb\xc2\xd5\x3d\x8e\x23\x9e\xc2\xdc\x3d\x4e\xbf\xb4\xd5\xfa\xb6\x3d\xad\xe7\xdc\x47\xee\xf1\x67\xdb\xb8\xba\x1e\xc3\xad\xc2\xad\xef\xd1\xb7\x32\xcd\x96\x8d\x17\x75\xd8\xea\xff\x3f\x12\xcb\xc2\x09\x41\x66\x0c\x85\x8b\xf9\xbc\x24\xc2\x7d\x85\xc4\x47\x3e\xe9\xe6\xeb\xc1\x34\xb9\x1c\x05\xfa\xcc\x82\x64\x62\x12\xf6\xd4\x6e\x47\xab\x21\x55\xb5\x95\x5c\xd8\x14\xb9\xbd\x06\x3e\x37\xbb\x30\xb3\xb5\x59\x6a\x12\x8d\x62\x3d\xab\x59\xae\x55\xf7\x36\xbc\xc7\x50\xeb\xce\x4b\x9c\x5c\xc7\xa9\x2e\x8d\x9b\x04\xbe\xaa\xd6\xd9\x74\xaa\x35\x03\x01\x07\x27\x04\x4a\xcb\x3b\xc5\xfc\x67\x2b\xd5\xbb\x98\x33\x21\x66\xc8\xd7\x1a\x3a\xb5\xb7\x7e\xf6\xc0\x74\x85\x39\xd2\xf1\xce\x1a\x44\xb7\x5c\x2b\x14\x9b\xde\xd6\x3c\xe3\xd6\x3a\x84\x30\x37\x7d\xb9\x9a\xc3\x5f\x4d\x08\x3a\xcb\xe7\xef\xbb\xec\xcc\x22\x94\x7c\x6e\x90\xe9\x72\xc9\x44\xc5\x67\xb6\xdb\xca\xd7\x5b\x6d\x82\x5e\xea\xeb\x79\xfd\x66\xc9\x7f\x9e\xe7\x13\x82\x4e\x4a\x1e\x54\xd6\x9f\x77\x90\x9e\x75\x1f\x06\x0c\x85\xaf\x18\x4a\x28\xe4\x53\xb8\xc7\xd0\xcd\x67\xa1\x59\xce\x8f\x3b\x61\xb8\x9e\x4b\x5f\x35\x1f\x98\x1e\x0b\x27\x3e\x39\xb7\x29\xcf\x61\x9d\xf0\x5f\x37\x5f\xbe\x7c\xdc\xc1\xae\x0f\xde\x44\x7c\xd1\xe9\xc7\x70\x0e\xe2\x28\x0e\xe7\x6e\xb9\xc1\x72\xf7\x9a\xa5\x03\xb9\xae\x5d\x1b\x04\x69\x71\xa6\xf3\xc0\x41\xcd\x6a\xdf\xa8\x9c\x80\xb8\x99\x24\xae\x13\x80\x83\x27\x43\xb3\xad\xe7\x4c\x21\xf1\xd4\x76\xd7\x63\x5b\xd8\x87\xc5\x69\xa8\x52\xc2\xf2\xfe\xb0\xd8\x9b\xaf\x57\xd5\xee\x64\x23\x0e\x6f\x8b\xc3\x97\x47\xf7\x48\x7d\xf9\x4f\xbe\x65\x74\x5f\x7d\x17\x1d\x68\xde\x3e\xe2\x99\xef\xf9\x3d\x7a\xce\x73\xff\x4c\xf1\xfe\xb9\x67\xaa\x38\x46\x7a\xbf\x7b\x48\x55\xb4\x0c\x08\x44\x90\x7e\xd0\x09\xe8\x43\x47\x99\x6b\x1f\x76\x94\xb9\x59\x1e\xac\xcc\xcb\xbe\x8f\x43\x08\x8a\x0e\xf2\x41\x90\x9f\x61\x71\x32\xd7\xde\xdb\xf2\xe5\xda\xbb\x5a\x3b\x74\x6d\x54\xbe\x7f\x5c\x18\x5f\xdd\x5f\x09\xc0\xb0\x41\x7c\x40\xa3\xa7\xea\x75\xe4\x74\xcd\xf6\xa9\x9a\x37\xc9\xdb\x39\x4d\xb1\x39\x39\xf1\x2a\x59\x62\xb1\x59\xfe\x7e\x77\xd3\x7c\x72\xc1\x96\xfa\xef\x72\x28\x7c\x7d\x8f\xd4\xde\x69\xc1\x97\x5e\xf0\x36\x03\x3c\x78\xf8\xfc\x50\xeb\x2e\xf0\x98\x23\xaa\xfb\x8e\xa7\xfe\xeb\x17\x5e\xad\x74\xee\x8c\x7b\x02\xe6\x20\x2e\x80\xf5\xc0\x35\x0f\x67\xcf\x66\x5c\x27\x56\x18\x9d\xb8\xec\xe2\xed\x76\xbb\x27\xee\xd0\x55\x1b\x60\x6e\xc0\x2c\xef\x5e\x3a\xbf\x84\x22\xc8\xcf\xe9\x5f\x8f\xa5\xc6\xa1\x23\xb8\xd7\xc5\x61\x8f\xf2\x92\xb3\xa3\xa9\x52\x23\x76\x40\x5a\x6d\xd9\x96\xde\x74\x2d\xc4\x55\x71\xdc\xd6\x4d\x41\xec\x1a\xc7\x03\x8c\x01\xe1\x68\x7a\xf2\xcc\xc7\x99\xb3\x33\xa8\x73\x8d\x34\xcc\xcf\x5f\x0c\x40\x92\x48\x33\x23\x38\x77\x98\x37\x9d\xc5\x20\x99\x85\x10\xf5\x6a\x0d\x3b\x93\xb8\x69\x17\x16\x6b\xc0\xf1\xb6\x25\x05\x19\x84\xe7\xae\x11\x29\xfd\xab\xb7\x39\x57\x4b\xcd\x80\xe5\x9d\x3d\x6b\x0c\xd2\xd8\xb5\xca\xcb\xe1\xae\xdb\x6e\xd4\x9c\x1b\x2e\x34\x4c\x17\x22\x33\xbd\x38\x73\x12\x19\xf9\xa9\xf0\x6b\x7f\xdd\x71\xc1\x85\x1d\xb7\xab\x2d\xd7\x07\x4d\xc7\x89\x81\xb3\xc6\x98\xe6\x1c\xc4\x17\x1c\x9a\x2e\xbb\x3f\x0c\x2a\x13\x2a\x2e\x83\x93\x2a\xf5\x53\xd5\xf3\xd7\x1e\x3a\x3a\xe0\x09\x57\x6f\xea\xab\xeb\xd0\x36\x52\xe3\x6e\x1f\xcf\x8a\x03\x3c\xc3\x30\x70\xd3\x30\xbe\x13\xdd\xc0\x81\xa0\x72\x88\x61\x06\x53\x37\x82\x60\x98\xab\x9a\xaa\x6c\xfc\x22\xe2\x67\x64\x69\x38\x74\x53\xd7\x31\x52\x70\x1c\x53\x0c\xeb\xcd\xd7\xb2\x15\x59\x73\xec\x67\xf6\x4e\x21\xee\x00\xfd\xa9\xeb\x13\xf3\x20\xbf\xd1\x06\x13\x24\xae\x33\x4b\x93\xfb\x2d\xe9\x15\x58\x15\xa7\xc6\x6f\x0d\xe7\xcc\xe5\x19\x0b\x60\xf6\xc2\xd0\xdb\xeb\x98\x0b\x59\xf4\x65\xf7\xda\x6c\xd3\x40\x63\xcb\x6b\x6e\x0d\x08\xe2\xf4\x24\xff\xbc\x20\xc8\xad\xd5\x50\x38\x59\x13\xc9\x3c\x49\x06\x1d\x18\x9a\xc6\xde\x15\xab\x1f\x15\x04\x1f\x3f\x92\x2f\xbe\x32\x1e\x5d\x42\x70\x5e\x11\x79\x0f\xdc\xc8\xf4\xa7\x8d\xbc\xf8\x65\xa1\xf7\x5b\xef\xef\x1e\x7a\xbf\x3d\x7c\x86\xde\xcf\xd0\xfb\x19\x7a\xff\x7a\xa1\xd7\x06\xf9\x29\x62\xfb\x33\xec\xae\x1f\xff\x94\x61\xf7\x73\xc0\x5b\xa4\xfa\x3b\x45\xdd\xda\xb9\xdb\x2f\xff\xe8\xa8\xab\x7c\x46\xdd\xbd\xcf\x67\xd4\x3d\xa6\xaf\xcf\xa8\xbb\x59\xf7\x08\x40\xfa\x19\x71\xd7\x8f\x7f\x5c\xc4\x7d\xd9\x19\x67\xaf\x49\xf8\x7a\x75\x73\x7f\x6c\xa9\xe6\xe5\xda\xcc\x6e\xed\xdb\xa1\x95\xf9\x20\x48\xdb\xad\xfb\x17\x92\x5f\x2e\x53\x1c\xb9\x9f\xe1\xea\x86\x7c\xc0\x1e\x48\xc2\x6c\xdc\x3e\x3c\x10\xd8\x6d\xdd\x9c\x36\x6e\x8d\x5a\xad\x71\x3b\xc5\x1b\x80\x7c\xb0\x1e\x00\xd1\x30\x6e\xae\xbe\x5e\xdd\xb4\x5c\x08\xdd\xc0\xb9\xba\xbf\xda\x94\x7a\x55\x8a\xbb\xa2\xc2\xa0\xb8\xde\x3a\x3c\xb4\x02\x74\xc0\xa6\x4e\xd4\xfc\x3e\x5f\x0a\xb5\x41\x9c\xbc\x5c\xa8\x7a\x29\xf6\x2c\xb7\x41\xdc\xe4\xc4\xdd\x5b\xef\x55\xdf\xc1\xd5\x24\x54\xe7\x36\x98\xba\x81\x5b\x5c\xc7\x90\x97\x7f\x08\x6d\xce\xad\xd0\x6d\x84\xe4\x06\xd9\x30\x6d\xd2\xb2\x1f\x1f\x6f\xa7\xa0\xde\xb8\xad\x13\xf8\xb7\x5b\xb2\xf6\x68\xde\x4e\xc9\x87\x7a\xed\x01\xe0\x8d\x7a\x03\x3b\xb2\xc0\x15\xed\xbc\xe6\xe5\xfa\xdf\x97\x75\xfa\x69\x51\xeb\x98\xf6\x62\x49\xf0\xf4\xd2\xd4\x07\x62\x00\x79\x8b\xe1\xb7\x51\x0c\xe6\x2e\x58\x7c\x0c\x16\xbc\xdf\x1c\xde\xc9\xce\x8f\xc2\xfa\xb1\x4b\x6e\x2e\x70\xb4\x0a\xe0\xec\x20\xd1\xc3\xe0\xf4\x4b\x51\xbe\x3b\x6e\x37\x3e\x68\x95\xce\x28\xee\xc5\x13\x4b\x8a\x77\x8c\x5c\x97\xb7\xe7\xe5\xd7\xc5\x9c\x18\xa3\xe4\x89\x71\xac\x78\xbb\xda\x3d\x51\x3f\x4c\xc7\xf6\x37\x78\x1c\x22\x38\xe5\xb5\x90\xdf\xfb\xb6\xfb\x9d\xa6\x21\xfd\x6e\x57\xff\x1c\x2f\x2f\x2c\x42\x04\x56\x86\x06\x7e\x39\x23\xf8\xc0\xd7\x30\x1c\x12\x5f\x45\xd4\x20\x39\x43\x93\xd6\x45\x5d\xfc\x1e\x96\x73\xf7\xe3\x15\xf0\xd4\x09\xec\x28\x74\x83\x13\x1d\xb3\xfd\xb9\xf0\xb6\xb7\x52\xf6\xae\xbf\xf5\xc1\x52\xb9\xe0\xcd\x0e\x6b\x21\x95\xff\xbd\xee\x66\xca\xeb\xff\x7f\xd9\x7e\xa7\x0b\x2e\x4d\x3c\x5f\xcf\xf7\xa8\x23\x1f\x48\x54\x2f\xca\xfb\xd3\xe8\xe4\x64\x8a\xe3\xf9\x2f\x7c\x83\x43\x79\x5f\xed\x87\x32\xff\x92\xf0\x5f\x1e\x0f\x5e\xec\xb8\xf9\x39\x5f\xe3\xf0\x13\x87\x8a\x3a\xc2\x5a\xe2\x4f\x1b\x2a\xca\xea\xff\xbc\xa1\x22\x02\x7f\x40\xb4\x88\x62\x77\x6e\xa4\xeb\x68\x51\xd6\x33\x7f\xe1\x45\xa1\xeb\xeb\x76\xf1\x26\x86\x23\x6f\xc8\x3a\x53\xc6\xce\x6b\x5c\xc0\xf7\xc2\x81\x08\x14\x63\x7f\x6c\x7f\x8c\xfc\x09\x07\x06\x84\xe1\x42\xd9\x69\x6c\xd3\xb2\x8a\xb7\xd0\x1d\x9b\x8d\x42\x59\xe8\x30\x5e\x18\xb1\x0d\x6c\x29\x36\xa6\x53\xd7\x3a\x93\xbc\x6b\xa4\x60\x61\x2c\xa5\xd8\x08\x12\x37\xad\xb6\xf4\x1e\x48\x9d\x25\x40\x00\x7e\x98\x82\x32\x47\x72\x22\x6d\x9c\x27\xdc\xad\xfc\x71\x48\x7b\xcb\xad\xe6\x1b\xdf\xab\x2c\xe8\xe0\x4c\xfc\x65\x9b\x70\xcb\x90\x74\x1f\x01\x10\xbb\x81\x73\xfb\x41\xa6\xf9\xe2\xef\x71\x21\xfd\x7b\xee\x2d\xfc\xf8\x37\x0a\x7d\xf4\x76\xd7\xd7\x77\xe3\x7f\xde\xe6\xe0\x9f\x1e\xf8\x63\x3c\x70\x7e\xec\x15\x02\x17\xbb\xde\x56\xe7\x6f\x7b\xe0\xbb\x48\xe2\x5f\xd7\xf5\x5e\xb8\xca\x47\x79\xe0\xc1\x6e\xfc\x7e\xae\xe7\xb9\x41\x6e\x72\xdd\x7c\x1e\x67\x33\x9d\xf5\xda\x79\x53\x2b\x0c\x12\x37\x49\x41\x60\x2d\xcf\xbd\xec\xab\x7c\xdb\x31\xb5\xc9\x31\x00\x73\x00\x8b\xd5\xae\x38\xdc\x7e\x63\xf1\x81\xfa\xef\xe9\xe0\x4d\x6c\xb8\xca\x5c\x2d\x19\x5e\xa2\xc4\x9d\x0a\xed\x73\xad\x03\x55\x7c\x31\xe7\x37\x9a\x4e\x41\xbc\xb5\xb0\x77\xf4\xf5\x6b\x6e\x24\x18\x81\x03\x68\x17\xa6\xc5\xbd\xf0\xeb\x45\x1a\x1c\xab\xdf\xd5\x89\x3b\x9c\x6c\xdc\x91\xc4\xd7\x3a\x76\xf7\xf0\xed\xae\x51\xbf\xc3\x6b\xf8\xd7\x06\x71\x87\x3f\x7c\xbb\xfb\x76\x57\xc3\xf2\xef\xdf\xc8\xbb\x06\x76\x57\x6f\xe4\x7f\x3c\x3e\xdc\xe1\x8f\xf5\x3b\xe2\xdb\xcd\xd7\x2b\x77\xfa\x0b\xf8\x2d\x33\x60\xb2\xb3\xcc\xf0\xf2\xf5\xf4\xf9\x1a\x43\xf1\xcf\xd7\xab\x9b\xaf\xe8\xdb\xe9\xe4\x87\x7d\xc0\x4d\x76\xa1\xaf\x68\x53\xe7\xdc\x16\x81\x5d\xdf\x78\xf3\x2b\x61\x7f\xe8\x6b\x5a\x2e\xb4\x89\x62\x34\xd0\x07\xcb\x96\x91\x00\x7b\x08\x52\x03\x99\x89\x1a\xbb\x29\xd8\x09\x6a\x17\xa1\xf6\xbf\xcf\x4e\x31\xbf\x6f\x61\xe5\x63\x48\x7d\x39\xd6\x3a\x00\x1b\x25\x16\x74\x9e\x23\x10\xbb\xe5\x4b\xc8\xae\xa9\x30\x06\x57\xbf\x88\xfc\xe0\xcb\x8f\x59\x19\x20\x6f\xb1\xc7\x1f\xcc\xd7\x76\xd1\xfd\x03\x28\x52\x55\x99\xb3\xd4\xe2\xa6\x29\x8c\x6e\x0e\xb1\x84\x03\xb6\x1a\x46\x15\xc0\x1e\x91\x99\xce\xe2\x30\x73\x66\x51\x96\xbf\x3c\xa1\x81\x61\x6f\x65\x1f\xaf\x5a\xf8\x44\xba\x44\xad\x78\xef\xa2\x61\xf2\x1b\x6c\x97\xbf\xfd\x7c\xa3\xd7\x8f\xb3\xc8\x3f\x7c\x8d\xea\xed\xd6\xda\x4c\x96\x81\x35\xca\xf7\x2b\x9d\x78\x09\xca\x75\x64\xc4\x69\xae\xf6\x3e\x38\xce\x3b\xca\x94\xe9\xec\xfc\x14\xf1\xf5\xbd\x7b\x62\xb6\xe6\xc8\x56\x9a\xab\x6d\x3a\xd5\x33\x92\xd9\x91\x28\x71\xa4\x0d\x25\x12\x4a\x29\x22\x42\xdf\xb0\xfa\x23\x86\xbd\xd6\x47\xbf\xa3\xab\xa1\xef\x2f\x3a\xe3\x43\xdd\xef\xde\x0a\x83\xd4\x70\x83\x9f\xf1\xed\xc0\x3f\xc4\x13\x77\xb4\x71\x89\x5b\x1e\xc3\xc0\x37\x96\xff\xb3\x23\x41\xb9\x95\xe4\x2f\x81\x00\x3f\x99\x5f\x97\xaa\xfd\xf4\xe7\x4f\x7f\x3e\x60\x63\xdf\xc9\x9f\xcb\x7d\xa2\x7f\x9f\x90\x7e\x8b\xff\x64\x6e\x5f\xf5\xc0\xa7\xdf\x7f\xfa\xfd\x01\x23\xfb\x4e\x7e\x3f\x8a\x40\x20\xce\xdc\x69\x4a\xc1\x2c\x49\x8f\xef\xa5\xff\x0e\x00\xb0\x23\xf1\x07\x43\x41\x16\xb8\xbf\x65\xa0\x0f\xce\x4d\x8e\xee\x26\xfe\x90\x77\x59\x5e\xa6\x9e\x75\xf2\x7b\xef\x94\x76\xaa\xcf\x99\x77\xd9\x9f\x5e\x33\xff\x0e\x95\xb6\x0a\x6b\xda\xd9\x95\xcf\xd8\x27\x3b\xba\xfa\xfc\x7c\x4d\x71\x41\x90\x7e\x4c\xe5\x8f\x5b\xf9\x9f\x82\x99\xee\x81\xc5\x67\xac\xfa\x8c\x55\x07\xac\xed\x3b\xc5\x2a\x71\x6b\x07\xfe\x5f\x83\xa8\xfe\x64\xfe\xbd\xa3\xe0\x4f\xdf\xfe\xf4\xed\x03\x96\x76\xec\xa4\xd4\x07\x5e\x3f\x77\x81\xdd\x9d\xbc\x0c\xef\xfd\x67\x8c\x36\xf5\xff\xa1\xe7\x83\x0c\xcb\xb6\x1f\x08\xe3\xe1\xb6\x56\x7b\x6c\xdc\xd6\x1f\xc1\xf4\xd6\xb4\xeb\xc4\xed\xf4\x1b\xf6\x6d\x6a\x1a\x8f\xb8\x01\x1e\x2e\x3c\x1f\x74\x5e\xeb\x7f\xa6\xb3\x41\x1f\x62\x88\x37\x34\x32\xb2\x72\x01\x70\xf7\xb8\xdb\xdf\xd6\xe2\xea\x36\xf9\x60\x92\x8f\xe6\x2d\x6e\xd7\xa7\xb7\xf5\x87\xc7\x87\x5b\x83\x20\xf1\x5b\xeb\xdb\xc3\x63\xad\x6e\x13\x38\xf1\x26\x8b\x9b\xfe\xad\x2c\xee\xcf\x70\x48\xf4\x72\x14\xfe\x3c\x1a\xfa\x27\x3f\x1a\xfa\xd7\x82\xfe\x3f\xeb\x92\xfb\x49\x74\xd8\x3a\xff\xf9\x76\x50\x78\x79\x2c\xf4\x65\x4b\xb6\x0a\xf9\x52\x45\xbf\x36\x27\x5e\xa1\xc4\xaf\x77\xe9\x97\xa5\xfd\x38\x3f\x7e\x4d\x3b\x7f\xa8\xcf\x9a\x60\x0a\xa6\x06\x86\xdf\x12\x06\x41\xde\xd6\x71\xf2\xe1\xf6\xb1\x66\x3c\xde\x12\x0f\xc4\x74\x5a\xab\x59\xa0\x86\xd7\xff\x96\xc1\xf3\x43\x37\x6e\x5d\xd6\xed\xc7\xfc\xf3\x1f\xc5\xdf\xbf\xff\xe3\xff\x02\x00\x00\xff\xff\xe8\xd5\xcb\xd8\xf5\xa9\x00\x00")
 
 func rpProductionJsonBytes() ([]byte, error) {
 	return bindataRead(
diff --git a/pkg/deploy/config.go b/pkg/deploy/config.go
index ed29e0320..52c3c6d01 100644
--- a/pkg/deploy/config.go
+++ b/pkg/deploy/config.go
@@ -39,7 +39,6 @@ type Configuration struct {
 	ExtraServiceKeyvaultAccessPolicies []interface{} `json:"extraServiceKeyvaultAccessPolicies,omitempty" value:"required"`
 	FPServerCertCommonName             *string       `json:"fpServerCertCommonName,omitempty"`
 	FPServicePrincipalID               *string       `json:"fpServicePrincipalId,omitempty" value:"required"`
-	GlobalMonitoringKeyVaultURI        *string       `json:"globalMonitoringKeyVaultUri,omitempty" value:"required"`
 	GlobalResourceGroupName            *string       `json:"globalResourceGroupName,omitempty" value:"required"`
 	GlobalResourceGroupLocation        *string       `json:"globalResourceGroupLocation,omitempty" value:"required"`
 	GlobalSubscriptionID               *string       `json:"globalSubscriptionId,omitempty" value:"required"`
diff --git a/pkg/deploy/deploy.go b/pkg/deploy/deploy.go
index 6a1d7506f..59bfae740 100644
--- a/pkg/deploy/deploy.go
+++ b/pkg/deploy/deploy.go
@@ -22,7 +22,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/dns"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/features"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/insights"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/msi"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/network"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/storage"
@@ -46,7 +45,6 @@ type deployer struct {
 	globalaccounts         storage.AccountsClient
 	deployments            features.DeploymentsClient
 	groups                 features.ResourceGroupsClient
-	metricalerts           insights.MetricAlertsClient
 	userassignedidentities msi.UserAssignedIdentitiesClient
 	publicipaddresses      network.PublicIPAddressesClient
 	vmss                   compute.VirtualMachineScaleSetsClient
@@ -85,7 +83,6 @@ func New(ctx context.Context, log *logrus.Entry, config *RPConfig, version strin
 		globalaccounts:         storage.NewAccountsClient(*config.Configuration.GlobalSubscriptionID, authorizer),
 		deployments:            features.NewDeploymentsClient(config.SubscriptionID, authorizer),
 		groups:                 features.NewResourceGroupsClient(config.SubscriptionID, authorizer),
-		metricalerts:           insights.NewMetricAlertsClient(config.SubscriptionID, authorizer),
 		userassignedidentities: msi.NewUserAssignedIdentitiesClient(config.SubscriptionID, authorizer),
 		publicipaddresses:      network.NewPublicIPAddressesClient(config.SubscriptionID, authorizer),
 		vmss:                   compute.NewVirtualMachineScaleSetsClient(config.SubscriptionID, authorizer),
@@ -171,11 +168,6 @@ func (d *deployer) Deploy(ctx context.Context) error {
 		if err != nil {
 			return err
 		}
-
-		err = d.removeOldMetricAlerts(ctx)
-		if err != nil {
-			return err
-		}
 	}
 
 	return nil
@@ -222,31 +214,6 @@ func (d *deployer) configureDNS(ctx context.Context) error {
 	return err
 }
 
-// removeOldMetricAlerts removes alert rules without the location in the name
-func (d *deployer) removeOldMetricAlerts(ctx context.Context) error {
-	d.log.Print("removing old alerts")
-	metricAlerts, err := d.metricalerts.ListByResourceGroup(ctx, d.config.ResourceGroupName)
-	if err != nil {
-		return err
-	}
-
-	if metricAlerts.Value == nil {
-		return nil
-	}
-
-	for _, metricAlert := range *metricAlerts.Value {
-		switch *metricAlert.Name {
-		case "rp-availability-alert", "rp-degraded-alert", "rp-vnet-alert":
-			_, err = d.metricalerts.Delete(ctx, d.config.ResourceGroupName, *metricAlert.Name)
-			if err != nil {
-				return err
-			}
-		}
-	}
-
-	return nil
-}
-
 // getParameters returns an *arm.Parameters populated with parameter names and
 // values.  The names are taken from the ps argument and the values are taken
 // from d.config.Configuration.
diff --git a/pkg/deploy/generator/const.go b/pkg/deploy/generator/const.go
index 4dfa63fb9..cad5b45a4 100644
--- a/pkg/deploy/generator/const.go
+++ b/pkg/deploy/generator/const.go
@@ -5,11 +5,8 @@ package generator
 
 // Deployment constants
 const (
-	KeyVaultTagName          = "vault"
-	ClustersKeyVaultTagValue = "clusters"
-	ServiceKeyVaultTagValue  = "service"
-	kvClusterSuffix          = "-cls"
-	kvServiceSuffix          = "-svc"
+	ClustersKeyvaultSuffix = "-cls"
+	ServiceKeyvaultSuffix  = "-svc"
 )
 
 // Template file constants
diff --git a/pkg/deploy/generator/resources.go b/pkg/deploy/generator/resources.go
index e808a1d24..9fb1e47bd 100644
--- a/pkg/deploy/generator/resources.go
+++ b/pkg/deploy/generator/resources.go
@@ -663,10 +663,12 @@ func (g *generator) vmss() *arm.Resource {
 		"mdsdConfigVersion",
 		"mdsdEnvironment",
 		"acrResourceId",
+		"domainName",
 		"rpImage",
 		"rpMode",
 		"adminApiClientCertCommonName",
 		"databaseAccountName",
+		"keyvaultPrefix",
 	} {
 		parts = append(parts,
 			fmt.Sprintf("'%s=$(base64 -d <<<'''", strings.ToUpper(variable)),
@@ -790,15 +792,14 @@ MDMIMAGE="${RPIMAGE%%/*}/${MDMIMAGE##*/}"
 docker pull "$MDMIMAGE"
 docker pull "$RPIMAGE"
 
-SVCVAULTURI="$(az keyvault list -g "$RESOURCEGROUPNAME" --query "[?tags.vault=='service'].properties.vaultUri" -o tsv)"
 for attempt in {1..5}; do
-  az keyvault secret download --file /etc/mdm.pem --id "${SVCVAULTURI}secrets/rp-mdm" && break
+  az keyvault secret download --file /etc/mdm.pem --id "https://$KEYVAULTPREFIX-svc.vault.azure.net/secrets/rp-mdm" && break
   if [[ ${attempt} -lt 5 ]]; then sleep 10; else exit 1; fi
 done
 chmod 0600 /etc/mdm.pem
 sed -i -ne '1,/END CERTIFICATE/ p' /etc/mdm.pem
 
-az keyvault secret download --file /etc/mdsd.pem --id "${SVCVAULTURI}secrets/rp-mdsd"
+az keyvault secret download --file /etc/mdsd.pem --id "https://$KEYVAULTPREFIX-svc.vault.azure.net/secrets/rp-mdsd"
 chown syslog:syslog /etc/mdsd.pem
 chmod 0600 /etc/mdsd.pem
 
@@ -883,6 +884,8 @@ MDM_NAMESPACE=RP
 ACR_RESOURCE_ID='$ACRRESOURCEID'
 ADMIN_API_CLIENT_CERT_COMMON_NAME='$ADMINAPICLIENTCERTCOMMONNAME'
 DATABASE_ACCOUNT_NAME='$DATABASEACCOUNTNAME'
+DOMAIN_NAME='$DOMAINNAME'
+KEYVAULT_PREFIX='$KEYVAULTPREFIX'
 RPIMAGE='$RPIMAGE'
 RP_MODE='$RPMODE'
 EOF
@@ -903,6 +906,8 @@ ExecStart=/usr/bin/docker run \
   -e MDM_NAMESPACE \
   -e ADMIN_API_CLIENT_CERT_COMMON_NAME \
   -e DATABASE_ACCOUNT_NAME \
+  -e DOMAIN_NAME \
+  -e KEYVAULT_PREFIX \
   -e RP_MODE \
   -e ACR_RESOURCE_ID \
   -m 2g \
@@ -928,6 +933,7 @@ MDM_NAMESPACE=BBM
 CLUSTER_MDM_ACCOUNT=AzureRedHatOpenShiftCluster
 CLUSTER_MDM_NAMESPACE=BBM
 DATABASE_ACCOUNT_NAME='$DATABASEACCOUNTNAME'
+KEYVAULT_PREFIX='$KEYVAULTPREFIX'
 RPIMAGE='$RPIMAGE'
 RP_MODE='$RPMODE'
 EOF
@@ -947,6 +953,7 @@ ExecStart=/usr/bin/docker run \
   -e CLUSTER_MDM_ACCOUNT \
   -e CLUSTER_MDM_NAMESPACE \
   -e DATABASE_ACCOUNT_NAME \
+  -e KEYVAULT_PREFIX \
   -e MDM_ACCOUNT \
   -e MDM_NAMESPACE \
   -e RP_MODE \
@@ -1114,6 +1121,7 @@ func (g *generator) zone() *arm.Resource {
 
 func (g *generator) clusterKeyvaultAccessPolicies() []mgmtkeyvault.AccessPolicyEntry {
 	return []mgmtkeyvault.AccessPolicyEntry{
+		// TODO: remove fpServicePrincipalId after next RP rollout
 		{
 			TenantID: &tenantUUIDHack,
 			ObjectID: to.StringPtr("[parameters('fpServicePrincipalId')]"),
@@ -1129,6 +1137,21 @@ func (g *generator) clusterKeyvaultAccessPolicies() []mgmtkeyvault.AccessPolicyE
 				},
 			},
 		},
+		{
+			TenantID: &tenantUUIDHack,
+			ObjectID: to.StringPtr("[parameters('rpServicePrincipalId')]"),
+			Permissions: &mgmtkeyvault.Permissions{
+				Secrets: &[]mgmtkeyvault.SecretPermissions{
+					mgmtkeyvault.SecretPermissionsGet,
+				},
+				Certificates: &[]mgmtkeyvault.CertificatePermissions{
+					mgmtkeyvault.Create,
+					mgmtkeyvault.Delete,
+					mgmtkeyvault.Get,
+					mgmtkeyvault.Update,
+				},
+			},
+		},
 	}
 }
 
@@ -1157,12 +1180,9 @@ func (g *generator) clustersKeyvault() *arm.Resource {
 			},
 			AccessPolicies: &[]mgmtkeyvault.AccessPolicyEntry{},
 		},
-		Name:     to.StringPtr("[concat(parameters('keyvaultPrefix'), '" + kvClusterSuffix + "')]"),
+		Name:     to.StringPtr("[concat(parameters('keyvaultPrefix'), '" + ClustersKeyvaultSuffix + "')]"),
 		Type:     to.StringPtr("Microsoft.KeyVault/vaults"),
 		Location: to.StringPtr("[resourceGroup().location]"),
-		Tags: map[string]*string{
-			KeyVaultTagName: to.StringPtr(ClustersKeyVaultTagValue),
-		},
 	}
 
 	if !g.production {
@@ -1198,12 +1218,9 @@ func (g *generator) serviceKeyvault() *arm.Resource {
 			},
 			AccessPolicies: &[]mgmtkeyvault.AccessPolicyEntry{},
 		},
-		Name:     to.StringPtr("[concat(parameters('keyvaultPrefix'), '" + kvServiceSuffix + "')]"),
+		Name:     to.StringPtr("[concat(parameters('keyvaultPrefix'), '" + ServiceKeyvaultSuffix + "')]"),
 		Type:     to.StringPtr("Microsoft.KeyVault/vaults"),
 		Location: to.StringPtr("[resourceGroup().location]"),
-		Tags: map[string]*string{
-			KeyVaultTagName: to.StringPtr(ServiceKeyVaultTagValue),
-		},
 	}
 
 	if !g.production {
diff --git a/pkg/deploy/generator/templates.go b/pkg/deploy/generator/templates.go
index 47cd5f73c..af00b4804 100644
--- a/pkg/deploy/generator/templates.go
+++ b/pkg/deploy/generator/templates.go
@@ -82,6 +82,7 @@ func (g *generator) rpTemplate() *arm.Template {
 			"adminApiClientCertCommonName",
 			"extraCosmosDBIPs",
 			"fullDeploy",
+			"keyvaultPrefix",
 			"mdmFrontendUrl",
 			"mdsdConfigVersion",
 			"mdsdEnvironment",
@@ -309,7 +310,7 @@ func (g *generator) preDeployTemplate() *arm.Template {
 			p.Type = "array"
 			p.DefaultValue = []string{}
 		case "keyvaultPrefix":
-			p.MaxLength = 24 - max(len(kvClusterSuffix), len(kvServiceSuffix))
+			p.MaxLength = 24 - max(len(ClustersKeyvaultSuffix), len(ServiceKeyvaultSuffix))
 		}
 		t.Parameters[param] = p
 	}
diff --git a/pkg/env/core.go b/pkg/env/core.go
index dd63ba46b..3ac2036e4 100644
--- a/pkg/env/core.go
+++ b/pkg/env/core.go
@@ -5,15 +5,11 @@ package env
 
 import (
 	"context"
-	"crypto/rsa"
-	"crypto/x509"
 
 	"github.com/sirupsen/logrus"
 
-	"github.com/Azure/ARO-RP/pkg/deploy/generator"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	"github.com/Azure/ARO-RP/pkg/util/instancemetadata"
-	"github.com/Azure/ARO-RP/pkg/util/keyvault"
 	"github.com/Azure/ARO-RP/pkg/util/rpauthorizer"
 )
 
@@ -21,31 +17,19 @@ type Core interface {
 	DeploymentMode() deployment.Mode
 	instancemetadata.InstanceMetadata
 	rpauthorizer.RPAuthorizer
-
-	GetBase64Secret(context.Context, string) ([]byte, error)
-	GetCertificateSecret(context.Context, string) (*rsa.PrivateKey, []*x509.Certificate, error)
 }
 
 type core struct {
 	instancemetadata.InstanceMetadata
 	rpauthorizer.RPAuthorizer
 
-	deploymentMode  deployment.Mode
-	servicekeyvault keyvault.Manager
+	deploymentMode deployment.Mode
 }
 
 func (c *core) DeploymentMode() deployment.Mode {
 	return c.deploymentMode
 }
 
-func (c *core) GetBase64Secret(ctx context.Context, secretName string) ([]byte, error) {
-	return c.servicekeyvault.GetBase64Secret(ctx, secretName)
-}
-
-func (c *core) GetCertificateSecret(ctx context.Context, secretName string) (*rsa.PrivateKey, []*x509.Certificate, error) {
-	return c.servicekeyvault.GetCertificateSecret(ctx, secretName)
-}
-
 func NewCore(ctx context.Context, log *logrus.Entry) (Core, error) {
 	deploymentMode := deployment.NewMode()
 	log.Infof("running in %s mode", deploymentMode)
@@ -60,21 +44,10 @@ func NewCore(ctx context.Context, log *logrus.Entry) (Core, error) {
 		return nil, err
 	}
 
-	rpKVAuthorizer, err := rpauthorizer.NewRPAuthorizer(instancemetadata.Environment().ResourceIdentifiers.KeyVault)
-	if err != nil {
-		return nil, err
-	}
-
-	serviceKeyvaultURI, err := keyvault.Find(ctx, instancemetadata, rpauthorizer, generator.ServiceKeyVaultTagValue)
-	if err != nil {
-		return nil, err
-	}
-
 	return &core{
 		InstanceMetadata: instancemetadata,
 		RPAuthorizer:     rpauthorizer,
 
-		deploymentMode:  deploymentMode,
-		servicekeyvault: keyvault.NewManager(rpKVAuthorizer, serviceKeyvaultURI),
+		deploymentMode: deploymentMode,
 	}, nil
 }
diff --git a/pkg/env/env.go b/pkg/env/env.go
index 3e5e65318..8458cbec2 100644
--- a/pkg/env/env.go
+++ b/pkg/env/env.go
@@ -14,6 +14,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/proxy"
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
+	"github.com/Azure/ARO-RP/pkg/util/keyvault"
 	"github.com/Azure/ARO-RP/pkg/util/refreshable"
 )
 
@@ -38,10 +39,11 @@ type Interface interface {
 	ClustersGenevaLoggingConfigVersion() string
 	ClustersGenevaLoggingEnvironment() string
 	ClustersGenevaLoggingSecret() (*rsa.PrivateKey, *x509.Certificate)
-	ClustersKeyvaultURI() string
+	ClustersKeyvault() keyvault.Manager
 	Domain() string
 	FPAuthorizer(string, string) (refreshable.Authorizer, error)
 	Listen() (net.Listener, error)
+	ServiceKeyvault() keyvault.Manager
 	Zones(vmSize string) ([]string, error)
 	ACRResourceID() string
 	ACRDomain() string
diff --git a/pkg/env/prod.go b/pkg/env/prod.go
index 659fce19a..0a1ffa1b3 100644
--- a/pkg/env/prod.go
+++ b/pkg/env/prod.go
@@ -20,7 +20,6 @@ import (
 	"github.com/Azure/ARO-RP/pkg/deploy/generator"
 	"github.com/Azure/ARO-RP/pkg/proxy"
 	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/compute"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/dns"
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	"github.com/Azure/ARO-RP/pkg/util/keyvault"
 	"github.com/Azure/ARO-RP/pkg/util/refreshable"
@@ -34,15 +33,17 @@ type prod struct {
 	armClientAuthorizer   clientauthorizer.ClientAuthorizer
 	adminClientAuthorizer clientauthorizer.ClientAuthorizer
 
-	acrDomain           string
-	clustersKeyvaultURI string
-	domain              string
-	zones               map[string][]string
+	acrDomain string
+	domain    string
+	zones     map[string][]string
 
 	fpCertificate *x509.Certificate
 	fpPrivateKey  *rsa.PrivateKey
 	fpClientID    string
 
+	clustersKeyvault keyvault.Manager
+	serviceKeyvault  keyvault.Manager
+
 	clustersGenevaLoggingCertificate   *x509.Certificate
 	clustersGenevaLoggingPrivateKey    *rsa.PrivateKey
 	clustersGenevaLoggingConfigVersion string
@@ -52,6 +53,14 @@ type prod struct {
 }
 
 func newProd(ctx context.Context, log *logrus.Entry) (*prod, error) {
+	for _, key := range []string{
+		"DOMAIN_NAME",
+	} {
+		if _, found := os.LookupEnv(key); !found {
+			return nil, fmt.Errorf("environment variable %q unset", key)
+		}
+	}
+
 	core, err := NewCore(ctx, log)
 	if err != nil {
 		return nil, err
@@ -77,22 +86,30 @@ func newProd(ctx context.Context, log *logrus.Entry) (*prod, error) {
 		return nil, err
 	}
 
-	err = p.populateDomain(ctx, rpAuthorizer)
+	rpKVAuthorizer, err := p.NewRPAuthorizer(p.Environment().ResourceIdentifiers.KeyVault)
 	if err != nil {
 		return nil, err
 	}
 
-	p.clustersKeyvaultURI, err = keyvault.Find(ctx, p, p, generator.ClustersKeyVaultTagValue)
+	clustersKeyvaultURI, err := keyvault.URI(p, generator.ClustersKeyvaultSuffix)
 	if err != nil {
 		return nil, err
 	}
 
+	serviceKeyvaultURI, err := keyvault.URI(p, generator.ServiceKeyvaultSuffix)
+	if err != nil {
+		return nil, err
+	}
+
+	p.clustersKeyvault = keyvault.NewManager(rpKVAuthorizer, clustersKeyvaultURI)
+	p.serviceKeyvault = keyvault.NewManager(rpKVAuthorizer, serviceKeyvaultURI)
+
 	err = p.populateZones(ctx, rpAuthorizer)
 	if err != nil {
 		return nil, err
 	}
 
-	fpPrivateKey, fpCertificates, err := p.GetCertificateSecret(ctx, RPFirstPartySecretName)
+	fpPrivateKey, fpCertificates, err := p.serviceKeyvault.GetCertificateSecret(ctx, RPFirstPartySecretName)
 	if err != nil {
 		return nil, err
 	}
@@ -101,7 +118,7 @@ func newProd(ctx context.Context, log *logrus.Entry) (*prod, error) {
 	p.fpCertificate = fpCertificates[0]
 	p.fpClientID = "f1dd0a37-89c6-4e07-bcd1-ffd3d43d8875"
 
-	clustersGenevaLoggingPrivateKey, clustersGenevaLoggingCertificates, err := p.GetCertificateSecret(ctx, ClusterLoggingSecretName)
+	clustersGenevaLoggingPrivateKey, clustersGenevaLoggingCertificates, err := p.serviceKeyvault.GetCertificateSecret(ctx, ClusterLoggingSecretName)
 	if err != nil {
 		return nil, err
 	}
@@ -158,23 +175,6 @@ func (p *prod) AROOperatorImage() string {
 	return fmt.Sprintf("%s/aro:%s", p.acrDomain, version.GitCommit)
 }
 
-func (p *prod) populateDomain(ctx context.Context, rpAuthorizer autorest.Authorizer) error {
-	zones := dns.NewZonesClient(p.SubscriptionID(), rpAuthorizer)
-
-	zs, err := zones.ListByResourceGroup(ctx, p.ResourceGroup(), nil)
-	if err != nil {
-		return err
-	}
-
-	if len(zs) != 1 {
-		return fmt.Errorf("found %d zones, expected 1", len(zs))
-	}
-
-	p.domain = *zs[0].Name
-
-	return nil
-}
-
 func (p *prod) populateZones(ctx context.Context, rpAuthorizer autorest.Authorizer) error {
 	c := compute.NewResourceSkusClient(p.SubscriptionID(), rpAuthorizer)
 
@@ -213,12 +213,12 @@ func (p *prod) ClustersGenevaLoggingSecret() (*rsa.PrivateKey, *x509.Certificate
 	return p.clustersGenevaLoggingPrivateKey, p.clustersGenevaLoggingCertificate
 }
 
-func (p *prod) ClustersKeyvaultURI() string {
-	return p.clustersKeyvaultURI
+func (p *prod) ClustersKeyvault() keyvault.Manager {
+	return p.clustersKeyvault
 }
 
 func (p *prod) Domain() string {
-	return p.domain
+	return os.Getenv("DOMAIN_NAME")
 }
 
 func (p *prod) FPAuthorizer(tenantID, resource string) (refreshable.Authorizer, error) {
@@ -239,6 +239,10 @@ func (p *prod) Listen() (net.Listener, error) {
 	return net.Listen("tcp", ":8443")
 }
 
+func (p *prod) ServiceKeyvault() keyvault.Manager {
+	return p.serviceKeyvault
+}
+
 func (p *prod) Zones(vmSize string) ([]string, error) {
 	zones, found := p.zones[vmSize]
 	if !found {
diff --git a/pkg/frontend/frontend.go b/pkg/frontend/frontend.go
index a4aca2a90..31ab0b8ae 100644
--- a/pkg/frontend/frontend.go
+++ b/pkg/frontend/frontend.go
@@ -103,7 +103,7 @@ func NewFrontend(ctx context.Context,
 		return nil, err
 	}
 
-	key, certs, err := f.env.GetCertificateSecret(ctx, env.RPServerSecretName)
+	key, certs, err := f.env.ServiceKeyvault().GetCertificateSecret(ctx, env.RPServerSecretName)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/util/azureclient/mgmt/dns/zones.go b/pkg/util/azureclient/mgmt/dns/zones.go
index af0f48267..2edf1fd34 100644
--- a/pkg/util/azureclient/mgmt/dns/zones.go
+++ b/pkg/util/azureclient/mgmt/dns/zones.go
@@ -12,7 +12,6 @@ import (
 
 // ZonesClient is a minimal interface for azure ZonesClient
 type ZonesClient interface {
-	ZonesClientAddons
 	Get(ctx context.Context, resourceGroupName string, zoneName string) (result mgmtdns.Zone, err error)
 }
 
diff --git a/pkg/util/azureclient/mgmt/dns/zones_addons.go b/pkg/util/azureclient/mgmt/dns/zones_addons.go
deleted file mode 100644
index 7da30af68..000000000
--- a/pkg/util/azureclient/mgmt/dns/zones_addons.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package dns
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-
-	mgmtdns "github.com/Azure/azure-sdk-for-go/services/dns/mgmt/2018-05-01/dns"
-)
-
-// ZonesClientAddons contains addons for ZonesClient
-type ZonesClientAddons interface {
-	ListByResourceGroup(ctx context.Context, resourceGroupName string, top *int32) (zones []mgmtdns.Zone, err error)
-}
-
-func (c *zonesClient) ListByResourceGroup(ctx context.Context, resourceGroupName string, top *int32) (zones []mgmtdns.Zone, err error) {
-	page, err := c.ZonesClient.ListByResourceGroup(ctx, resourceGroupName, top)
-	if err != nil {
-		return nil, err
-	}
-
-	for page.NotDone() {
-		zones = append(zones, page.Values()...)
-
-		err = page.NextWithContext(ctx)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	return zones, nil
-}
diff --git a/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go b/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go
index 0353950b8..b54ce5235 100644
--- a/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go
+++ b/pkg/util/azureclient/mgmt/documentdb/databaseaccounts.go
@@ -12,7 +12,6 @@ import (
 
 // DatabaseAccountsClient is a minimal interface for azure DatabaseAccountsClient
 type DatabaseAccountsClient interface {
-	ListByResourceGroup(ctx context.Context, resourceGroupName string) (result mgmtdocumentdb.DatabaseAccountsListResult, err error)
 	ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result mgmtdocumentdb.DatabaseAccountListKeysResult, err error)
 }
 
diff --git a/pkg/util/azureclient/mgmt/documentdb/generate.go b/pkg/util/azureclient/mgmt/documentdb/generate.go
deleted file mode 100644
index b98ef9981..000000000
--- a/pkg/util/azureclient/mgmt/documentdb/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package documentdb
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-//go:generate rm -rf ../../../../util/mocks/$GOPACKAGE
-//go:generate go run ../../../../../vendor/github.com/golang/mock/mockgen -destination=../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/$GOPACKAGE DatabaseAccountsClient
-//go:generate go run ../../../../../vendor/golang.org/x/tools/cmd/goimports -local=github.com/Azure/ARO-RP -e -w ../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go
diff --git a/pkg/util/azureclient/mgmt/insights/generate.go b/pkg/util/azureclient/mgmt/insights/generate.go
deleted file mode 100644
index bf7f65149..000000000
--- a/pkg/util/azureclient/mgmt/insights/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package insights
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-//go:generate rm -rf ../../../../util/mocks/$GOPACKAGE
-//go:generate go run ../../../../../vendor/github.com/golang/mock/mockgen -destination=../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/$GOPACKAGE MetricAlertsClient,ActivityLogsClient
-//go:generate go run ../../../../../vendor/golang.org/x/tools/cmd/goimports -local=github.com/Azure/ARO-RP -e -w ../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go
diff --git a/pkg/util/azureclient/mgmt/insights/metricalerts.go b/pkg/util/azureclient/mgmt/insights/metricalerts.go
deleted file mode 100644
index cea1ca7c7..000000000
--- a/pkg/util/azureclient/mgmt/insights/metricalerts.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package insights
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-
-	mgmtinsights "github.com/Azure/azure-sdk-for-go/services/preview/monitor/mgmt/2018-03-01/insights"
-	"github.com/Azure/go-autorest/autorest"
-)
-
-// MetricAlertsClient is a minimal interface for azure MetricAlertsClient
-type MetricAlertsClient interface {
-	Delete(ctx context.Context, resourceGroupName string, ruleName string) (result autorest.Response, err error)
-	ListByResourceGroup(ctx context.Context, resourceGroupName string) (result mgmtinsights.MetricAlertResourceCollection, err error)
-}
-
-type metricAlertsClient struct {
-	mgmtinsights.MetricAlertsClient
-}
-
-var _ MetricAlertsClient = &metricAlertsClient{}
-
-// NewMetricAlertsClient creates a new MetricAlertsClient
-func NewMetricAlertsClient(subscriptionID string, authorizer autorest.Authorizer) MetricAlertsClient {
-	client := mgmtinsights.NewMetricAlertsClient(subscriptionID)
-	client.Authorizer = authorizer
-
-	return &metricAlertsClient{
-		MetricAlertsClient: client,
-	}
-}
diff --git a/pkg/util/azureclient/mgmt/keyvault/generate.go b/pkg/util/azureclient/mgmt/keyvault/generate.go
deleted file mode 100644
index ae3ce59dd..000000000
--- a/pkg/util/azureclient/mgmt/keyvault/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package keyvault
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-//go:generate rm -rf ../../../../util/mocks/$GOPACKAGE
-//go:generate go run ../../../../../vendor/github.com/golang/mock/mockgen -destination=../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/$GOPACKAGE VaultsClient
-//go:generate go run ../../../../../vendor/golang.org/x/tools/cmd/goimports -local=github.com/Azure/ARO-RP -e -w ../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go
diff --git a/pkg/util/azureclient/mgmt/keyvault/vaults.go b/pkg/util/azureclient/mgmt/keyvault/vaults.go
deleted file mode 100644
index 532fb08b4..000000000
--- a/pkg/util/azureclient/mgmt/keyvault/vaults.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package keyvault
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	mgmtkeyvault "github.com/Azure/azure-sdk-for-go/services/keyvault/mgmt/2016-10-01/keyvault"
-	"github.com/Azure/go-autorest/autorest"
-)
-
-// VaultsClient is a minimal interface for azure VaultsClient
-type VaultsClient interface {
-	VaultsClientAddons
-}
-
-type vaultsClient struct {
-	mgmtkeyvault.VaultsClient
-}
-
-var _ VaultsClient = &vaultsClient{}
-
-// NewVaultsClient creates a new VaultsClient
-func NewVaultsClient(subscriptionID string, authorizer autorest.Authorizer) VaultsClient {
-	client := mgmtkeyvault.NewVaultsClient(subscriptionID)
-	client.Authorizer = authorizer
-
-	return &vaultsClient{
-		VaultsClient: client,
-	}
-}
diff --git a/pkg/util/azureclient/mgmt/keyvault/vaults_addons.go b/pkg/util/azureclient/mgmt/keyvault/vaults_addons.go
deleted file mode 100644
index b27849a2f..000000000
--- a/pkg/util/azureclient/mgmt/keyvault/vaults_addons.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package keyvault
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-
-	mgmtkeyvault "github.com/Azure/azure-sdk-for-go/services/keyvault/mgmt/2016-10-01/keyvault"
-)
-
-// VaultsClientAddons contains addons for VaultsClient
-type VaultsClientAddons interface {
-	ListByResourceGroup(ctx context.Context, resourceGroupName string, top *int32) (vaults []mgmtkeyvault.Vault, err error)
-}
-
-func (c *vaultsClient) ListByResourceGroup(ctx context.Context, resourceGroupName string, top *int32) (vaults []mgmtkeyvault.Vault, err error) {
-	page, err := c.VaultsClient.ListByResourceGroup(ctx, resourceGroupName, top)
-	if err != nil {
-		return nil, err
-	}
-
-	for page.NotDone() {
-		vaults = append(vaults, page.Values()...)
-
-		err = page.NextWithContext(ctx)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	return vaults, nil
-}
diff --git a/pkg/util/azureclient/mgmt/msi/generate.go b/pkg/util/azureclient/mgmt/msi/generate.go
deleted file mode 100644
index f472fe1ef..000000000
--- a/pkg/util/azureclient/mgmt/msi/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package msi
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-//go:generate rm -rf ../../../../util/mocks/$GOPACKAGE
-//go:generate go run ../../../../../vendor/github.com/golang/mock/mockgen -destination=../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/$GOPACKAGE UserAssignedIdentitiesClient
-//go:generate go run ../../../../../vendor/golang.org/x/tools/cmd/goimports -local=github.com/Azure/ARO-RP -e -w ../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go
diff --git a/pkg/util/azureclient/mgmt/privatedns/generate.go b/pkg/util/azureclient/mgmt/privatedns/generate.go
deleted file mode 100644
index 7a1b9c8a9..000000000
--- a/pkg/util/azureclient/mgmt/privatedns/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package privatedns
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-//go:generate rm -rf ../../../../util/mocks/$GOPACKAGE
-//go:generate go run ../../../../../vendor/github.com/golang/mock/mockgen -destination=../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/$GOPACKAGE VirtualNetworkLinksClient
-//go:generate go run ../../../../../vendor/golang.org/x/tools/cmd/goimports -local=github.com/Azure/ARO-RP -e -w ../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go
diff --git a/pkg/util/azureclient/mgmt/redhatopenshift/generate.go b/pkg/util/azureclient/mgmt/redhatopenshift/generate.go
deleted file mode 100644
index f20c4c565..000000000
--- a/pkg/util/azureclient/mgmt/redhatopenshift/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package redhatopenshift
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-//go:generate rm -rf ../../../../util/mocks/$GOPACKAGE
-//go:generate go run ../../../../../vendor/github.com/golang/mock/mockgen -destination=../../../../util/mocks/azureclient/mgmt/mock_$GOPACKAGE/$GOPACKAGE.go github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/$GOPACKAGE OpenShiftClustersClient,OperationsClient
-//go:generate go run ../../../../../vendor/golang.org/x/tools/cmd/goimports -local=github.com/Azure/ARO-RP -e -w ../../../../util/mocks/azureclient/mgmt/mock_$GOPACKAGE/$GOPACKAGE.go
diff --git a/pkg/util/azureclient/mgmt/storage/accounts.go b/pkg/util/azureclient/mgmt/storage/accounts.go
index f1fe98c85..4c1d1c25e 100644
--- a/pkg/util/azureclient/mgmt/storage/accounts.go
+++ b/pkg/util/azureclient/mgmt/storage/accounts.go
@@ -13,7 +13,6 @@ import (
 // AccountsClient is a minimal interface for azure AccountsClient
 type AccountsClient interface {
 	ListAccountSAS(ctx context.Context, resourceGroupName string, accountName string, parameters mgmtstorage.AccountSasParameters) (result mgmtstorage.ListAccountSasResponse, err error)
-	ListByResourceGroup(context context.Context, resourceGroup string) (mgmtstorage.AccountListResult, error)
 	ListKeys(ctx context.Context, resourceGroupName string, accountName string, expand mgmtstorage.ListKeyExpand) (result mgmtstorage.AccountListKeysResult, err error)
 	AccountsClientAddons
 }
diff --git a/pkg/util/azureclient/mgmt/storage/generate.go b/pkg/util/azureclient/mgmt/storage/generate.go
deleted file mode 100644
index 943a2fc89..000000000
--- a/pkg/util/azureclient/mgmt/storage/generate.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package storage
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-//go:generate rm -rf ../../../../util/mocks/$GOPACKAGE
-//go:generate go run ../../../../../vendor/github.com/golang/mock/mockgen -destination=../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/$GOPACKAGE AccountsClient
-//go:generate go run ../../../../../vendor/golang.org/x/tools/cmd/goimports -local=github.com/Azure/ARO-RP -e -w ../../../../util/mocks/azureclient/mgmt/$GOPACKAGE/$GOPACKAGE.go
diff --git a/pkg/util/encryption/xchacha20poly1305.go b/pkg/util/encryption/xchacha20poly1305.go
index 0287d93c4..75a134081 100644
--- a/pkg/util/encryption/xchacha20poly1305.go
+++ b/pkg/util/encryption/xchacha20poly1305.go
@@ -10,8 +10,6 @@ import (
 	"fmt"
 
 	"golang.org/x/crypto/chacha20poly1305"
-
-	"github.com/Azure/ARO-RP/pkg/env"
 )
 
 var _ Cipher = (*aeadCipher)(nil)
@@ -26,12 +24,7 @@ type aeadCipher struct {
 	randRead func([]byte) (int, error)
 }
 
-func NewXChaCha20Poly1305(ctx context.Context, _env env.Core, secretName string) (Cipher, error) {
-	key, err := _env.GetBase64Secret(ctx, secretName)
-	if err != nil {
-		return nil, err
-	}
-
+func NewXChaCha20Poly1305(ctx context.Context, key []byte) (Cipher, error) {
 	aead, err := chacha20poly1305.NewX(key)
 	if err != nil {
 		return nil, err
diff --git a/pkg/util/keyvault/find.go b/pkg/util/keyvault/find.go
deleted file mode 100644
index 678c544c6..000000000
--- a/pkg/util/keyvault/find.go
+++ /dev/null
@@ -1,37 +0,0 @@
-package keyvault
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"context"
-	"fmt"
-
-	"github.com/Azure/ARO-RP/pkg/deploy/generator"
-	"github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/keyvault"
-	"github.com/Azure/ARO-RP/pkg/util/instancemetadata"
-	"github.com/Azure/ARO-RP/pkg/util/rpauthorizer"
-)
-
-func Find(ctx context.Context, instancemetadata instancemetadata.InstanceMetadata, rpauthorizer rpauthorizer.RPAuthorizer, tagValue string) (string, error) {
-	rpAuthorizer, err := rpauthorizer.NewRPAuthorizer(instancemetadata.Environment().ResourceManagerEndpoint)
-	if err != nil {
-		return "", err
-	}
-
-	vaults := keyvault.NewVaultsClient(instancemetadata.SubscriptionID(), rpAuthorizer)
-
-	vs, err := vaults.ListByResourceGroup(ctx, instancemetadata.ResourceGroup(), nil)
-	if err != nil {
-		return "", err
-	}
-
-	for _, v := range vs {
-		if v.Tags[generator.KeyVaultTagName] != nil &&
-			*v.Tags[generator.KeyVaultTagName] == tagValue {
-			return *v.Properties.VaultURI, nil
-		}
-	}
-
-	return "", fmt.Errorf("key vault with tag %s=%s not found", generator.KeyVaultTagName, tagValue)
-}
diff --git a/pkg/util/keyvault/uri.go b/pkg/util/keyvault/uri.go
new file mode 100644
index 000000000..196765b5a
--- /dev/null
+++ b/pkg/util/keyvault/uri.go
@@ -0,0 +1,23 @@
+package keyvault
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/Azure/ARO-RP/pkg/util/instancemetadata"
+)
+
+func URI(instancemetadata instancemetadata.InstanceMetadata, suffix string) (string, error) {
+	for _, key := range []string{
+		"KEYVAULT_PREFIX",
+	} {
+		if _, found := os.LookupEnv(key); !found {
+			return "", fmt.Errorf("environment variable %q unset", key)
+		}
+	}
+
+	return fmt.Sprintf("https://%s%s.%s/", os.Getenv("KEYVAULT_PREFIX"), suffix, instancemetadata.Environment().KeyVaultDNSSuffix), nil
+}
diff --git a/pkg/util/mocks/azureclient/mgmt/dns/dns.go b/pkg/util/mocks/azureclient/mgmt/dns/dns.go
index 60086b7e3..0cccfb227 100644
--- a/pkg/util/mocks/azureclient/mgmt/dns/dns.go
+++ b/pkg/util/mocks/azureclient/mgmt/dns/dns.go
@@ -118,18 +118,3 @@ func (mr *MockZonesClientMockRecorder) Get(arg0, arg1, arg2 interface{}) *gomock
 	mr.mock.ctrl.T.Helper()
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockZonesClient)(nil).Get), arg0, arg1, arg2)
 }
-
-// ListByResourceGroup mocks base method
-func (m *MockZonesClient) ListByResourceGroup(arg0 context.Context, arg1 string, arg2 *int32) ([]dns.Zone, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", arg0, arg1, arg2)
-	ret0, _ := ret[0].([]dns.Zone)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListByResourceGroup indicates an expected call of ListByResourceGroup
-func (mr *MockZonesClientMockRecorder) ListByResourceGroup(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockZonesClient)(nil).ListByResourceGroup), arg0, arg1, arg2)
-}
diff --git a/pkg/util/mocks/azureclient/mgmt/documentdb/documentdb.go b/pkg/util/mocks/azureclient/mgmt/documentdb/documentdb.go
deleted file mode 100644
index 90857f968..000000000
--- a/pkg/util/mocks/azureclient/mgmt/documentdb/documentdb.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/documentdb (interfaces: DatabaseAccountsClient)
-
-// Package mock_documentdb is a generated GoMock package.
-package mock_documentdb
-
-import (
-	context "context"
-	reflect "reflect"
-
-	documentdb "github.com/Azure/azure-sdk-for-go/services/cosmos-db/mgmt/2019-08-01/documentdb"
-	gomock "github.com/golang/mock/gomock"
-)
-
-// MockDatabaseAccountsClient is a mock of DatabaseAccountsClient interface
-type MockDatabaseAccountsClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockDatabaseAccountsClientMockRecorder
-}
-
-// MockDatabaseAccountsClientMockRecorder is the mock recorder for MockDatabaseAccountsClient
-type MockDatabaseAccountsClientMockRecorder struct {
-	mock *MockDatabaseAccountsClient
-}
-
-// NewMockDatabaseAccountsClient creates a new mock instance
-func NewMockDatabaseAccountsClient(ctrl *gomock.Controller) *MockDatabaseAccountsClient {
-	mock := &MockDatabaseAccountsClient{ctrl: ctrl}
-	mock.recorder = &MockDatabaseAccountsClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockDatabaseAccountsClient) EXPECT() *MockDatabaseAccountsClientMockRecorder {
-	return m.recorder
-}
-
-// ListByResourceGroup mocks base method
-func (m *MockDatabaseAccountsClient) ListByResourceGroup(arg0 context.Context, arg1 string) (documentdb.DatabaseAccountsListResult, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", arg0, arg1)
-	ret0, _ := ret[0].(documentdb.DatabaseAccountsListResult)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListByResourceGroup indicates an expected call of ListByResourceGroup
-func (mr *MockDatabaseAccountsClientMockRecorder) ListByResourceGroup(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockDatabaseAccountsClient)(nil).ListByResourceGroup), arg0, arg1)
-}
-
-// ListKeys mocks base method
-func (m *MockDatabaseAccountsClient) ListKeys(arg0 context.Context, arg1, arg2 string) (documentdb.DatabaseAccountListKeysResult, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListKeys", arg0, arg1, arg2)
-	ret0, _ := ret[0].(documentdb.DatabaseAccountListKeysResult)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListKeys indicates an expected call of ListKeys
-func (mr *MockDatabaseAccountsClientMockRecorder) ListKeys(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListKeys", reflect.TypeOf((*MockDatabaseAccountsClient)(nil).ListKeys), arg0, arg1, arg2)
-}
diff --git a/pkg/util/mocks/azureclient/mgmt/insights/insights.go b/pkg/util/mocks/azureclient/mgmt/insights/insights.go
deleted file mode 100644
index 781aa2768..000000000
--- a/pkg/util/mocks/azureclient/mgmt/insights/insights.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/insights (interfaces: MetricAlertsClient,ActivityLogsClient)
-
-// Package mock_insights is a generated GoMock package.
-package mock_insights
-
-import (
-	context "context"
-	reflect "reflect"
-
-	insights "github.com/Azure/azure-sdk-for-go/services/preview/monitor/mgmt/2018-03-01/insights"
-	autorest "github.com/Azure/go-autorest/autorest"
-	gomock "github.com/golang/mock/gomock"
-)
-
-// MockMetricAlertsClient is a mock of MetricAlertsClient interface
-type MockMetricAlertsClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockMetricAlertsClientMockRecorder
-}
-
-// MockMetricAlertsClientMockRecorder is the mock recorder for MockMetricAlertsClient
-type MockMetricAlertsClientMockRecorder struct {
-	mock *MockMetricAlertsClient
-}
-
-// NewMockMetricAlertsClient creates a new mock instance
-func NewMockMetricAlertsClient(ctrl *gomock.Controller) *MockMetricAlertsClient {
-	mock := &MockMetricAlertsClient{ctrl: ctrl}
-	mock.recorder = &MockMetricAlertsClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockMetricAlertsClient) EXPECT() *MockMetricAlertsClientMockRecorder {
-	return m.recorder
-}
-
-// Delete mocks base method
-func (m *MockMetricAlertsClient) Delete(arg0 context.Context, arg1, arg2 string) (autorest.Response, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Delete", arg0, arg1, arg2)
-	ret0, _ := ret[0].(autorest.Response)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// Delete indicates an expected call of Delete
-func (mr *MockMetricAlertsClientMockRecorder) Delete(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockMetricAlertsClient)(nil).Delete), arg0, arg1, arg2)
-}
-
-// ListByResourceGroup mocks base method
-func (m *MockMetricAlertsClient) ListByResourceGroup(arg0 context.Context, arg1 string) (insights.MetricAlertResourceCollection, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", arg0, arg1)
-	ret0, _ := ret[0].(insights.MetricAlertResourceCollection)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListByResourceGroup indicates an expected call of ListByResourceGroup
-func (mr *MockMetricAlertsClientMockRecorder) ListByResourceGroup(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockMetricAlertsClient)(nil).ListByResourceGroup), arg0, arg1)
-}
-
-// MockActivityLogsClient is a mock of ActivityLogsClient interface
-type MockActivityLogsClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockActivityLogsClientMockRecorder
-}
-
-// MockActivityLogsClientMockRecorder is the mock recorder for MockActivityLogsClient
-type MockActivityLogsClientMockRecorder struct {
-	mock *MockActivityLogsClient
-}
-
-// NewMockActivityLogsClient creates a new mock instance
-func NewMockActivityLogsClient(ctrl *gomock.Controller) *MockActivityLogsClient {
-	mock := &MockActivityLogsClient{ctrl: ctrl}
-	mock.recorder = &MockActivityLogsClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockActivityLogsClient) EXPECT() *MockActivityLogsClientMockRecorder {
-	return m.recorder
-}
-
-// List mocks base method
-func (m *MockActivityLogsClient) List(arg0 context.Context, arg1, arg2 string) ([]insights.EventData, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "List", arg0, arg1, arg2)
-	ret0, _ := ret[0].([]insights.EventData)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// List indicates an expected call of List
-func (mr *MockActivityLogsClientMockRecorder) List(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockActivityLogsClient)(nil).List), arg0, arg1, arg2)
-}
diff --git a/pkg/util/mocks/azureclient/mgmt/keyvault/keyvault.go b/pkg/util/mocks/azureclient/mgmt/keyvault/keyvault.go
deleted file mode 100644
index d94c9475c..000000000
--- a/pkg/util/mocks/azureclient/mgmt/keyvault/keyvault.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/keyvault (interfaces: VaultsClient)
-
-// Package mock_keyvault is a generated GoMock package.
-package mock_keyvault
-
-import (
-	context "context"
-	reflect "reflect"
-
-	keyvault "github.com/Azure/azure-sdk-for-go/services/keyvault/mgmt/2016-10-01/keyvault"
-	gomock "github.com/golang/mock/gomock"
-)
-
-// MockVaultsClient is a mock of VaultsClient interface
-type MockVaultsClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockVaultsClientMockRecorder
-}
-
-// MockVaultsClientMockRecorder is the mock recorder for MockVaultsClient
-type MockVaultsClientMockRecorder struct {
-	mock *MockVaultsClient
-}
-
-// NewMockVaultsClient creates a new mock instance
-func NewMockVaultsClient(ctrl *gomock.Controller) *MockVaultsClient {
-	mock := &MockVaultsClient{ctrl: ctrl}
-	mock.recorder = &MockVaultsClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockVaultsClient) EXPECT() *MockVaultsClientMockRecorder {
-	return m.recorder
-}
-
-// ListByResourceGroup mocks base method
-func (m *MockVaultsClient) ListByResourceGroup(arg0 context.Context, arg1 string, arg2 *int32) ([]keyvault.Vault, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", arg0, arg1, arg2)
-	ret0, _ := ret[0].([]keyvault.Vault)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListByResourceGroup indicates an expected call of ListByResourceGroup
-func (mr *MockVaultsClientMockRecorder) ListByResourceGroup(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockVaultsClient)(nil).ListByResourceGroup), arg0, arg1, arg2)
-}
diff --git a/pkg/util/mocks/azureclient/mgmt/mock_redhatopenshift/redhatopenshift.go b/pkg/util/mocks/azureclient/mgmt/mock_redhatopenshift/redhatopenshift.go
deleted file mode 100644
index de005de5e..000000000
--- a/pkg/util/mocks/azureclient/mgmt/mock_redhatopenshift/redhatopenshift.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/redhatopenshift (interfaces: OpenShiftClustersClient,OperationsClient)
-
-// Package mock_redhatopenshift is a generated GoMock package.
-package mock_redhatopenshift
-
-import (
-	context "context"
-	reflect "reflect"
-
-	gomock "github.com/golang/mock/gomock"
-
-	redhatopenshift "github.com/Azure/ARO-RP/pkg/client/services/redhatopenshift/mgmt/2020-04-30/redhatopenshift"
-)
-
-// MockOpenShiftClustersClient is a mock of OpenShiftClustersClient interface
-type MockOpenShiftClustersClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockOpenShiftClustersClientMockRecorder
-}
-
-// MockOpenShiftClustersClientMockRecorder is the mock recorder for MockOpenShiftClustersClient
-type MockOpenShiftClustersClientMockRecorder struct {
-	mock *MockOpenShiftClustersClient
-}
-
-// NewMockOpenShiftClustersClient creates a new mock instance
-func NewMockOpenShiftClustersClient(ctrl *gomock.Controller) *MockOpenShiftClustersClient {
-	mock := &MockOpenShiftClustersClient{ctrl: ctrl}
-	mock.recorder = &MockOpenShiftClustersClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockOpenShiftClustersClient) EXPECT() *MockOpenShiftClustersClientMockRecorder {
-	return m.recorder
-}
-
-// CreateOrUpdateAndWait mocks base method
-func (m *MockOpenShiftClustersClient) CreateOrUpdateAndWait(arg0 context.Context, arg1, arg2 string, arg3 redhatopenshift.OpenShiftCluster) error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "CreateOrUpdateAndWait", arg0, arg1, arg2, arg3)
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// CreateOrUpdateAndWait indicates an expected call of CreateOrUpdateAndWait
-func (mr *MockOpenShiftClustersClientMockRecorder) CreateOrUpdateAndWait(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdateAndWait", reflect.TypeOf((*MockOpenShiftClustersClient)(nil).CreateOrUpdateAndWait), arg0, arg1, arg2, arg3)
-}
-
-// DeleteAndWait mocks base method
-func (m *MockOpenShiftClustersClient) DeleteAndWait(arg0 context.Context, arg1, arg2 string) error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "DeleteAndWait", arg0, arg1, arg2)
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// DeleteAndWait indicates an expected call of DeleteAndWait
-func (mr *MockOpenShiftClustersClientMockRecorder) DeleteAndWait(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAndWait", reflect.TypeOf((*MockOpenShiftClustersClient)(nil).DeleteAndWait), arg0, arg1, arg2)
-}
-
-// Get mocks base method
-func (m *MockOpenShiftClustersClient) Get(arg0 context.Context, arg1, arg2 string) (redhatopenshift.OpenShiftCluster, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Get", arg0, arg1, arg2)
-	ret0, _ := ret[0].(redhatopenshift.OpenShiftCluster)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// Get indicates an expected call of Get
-func (mr *MockOpenShiftClustersClientMockRecorder) Get(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockOpenShiftClustersClient)(nil).Get), arg0, arg1, arg2)
-}
-
-// List mocks base method
-func (m *MockOpenShiftClustersClient) List(arg0 context.Context) ([]redhatopenshift.OpenShiftCluster, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "List", arg0)
-	ret0, _ := ret[0].([]redhatopenshift.OpenShiftCluster)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// List indicates an expected call of List
-func (mr *MockOpenShiftClustersClientMockRecorder) List(arg0 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockOpenShiftClustersClient)(nil).List), arg0)
-}
-
-// ListByResourceGroup mocks base method
-func (m *MockOpenShiftClustersClient) ListByResourceGroup(arg0 context.Context, arg1 string) ([]redhatopenshift.OpenShiftCluster, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", arg0, arg1)
-	ret0, _ := ret[0].([]redhatopenshift.OpenShiftCluster)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListByResourceGroup indicates an expected call of ListByResourceGroup
-func (mr *MockOpenShiftClustersClientMockRecorder) ListByResourceGroup(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockOpenShiftClustersClient)(nil).ListByResourceGroup), arg0, arg1)
-}
-
-// ListCredentials mocks base method
-func (m *MockOpenShiftClustersClient) ListCredentials(arg0 context.Context, arg1, arg2 string) (redhatopenshift.OpenShiftClusterCredentials, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListCredentials", arg0, arg1, arg2)
-	ret0, _ := ret[0].(redhatopenshift.OpenShiftClusterCredentials)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListCredentials indicates an expected call of ListCredentials
-func (mr *MockOpenShiftClustersClientMockRecorder) ListCredentials(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListCredentials", reflect.TypeOf((*MockOpenShiftClustersClient)(nil).ListCredentials), arg0, arg1, arg2)
-}
-
-// MockOperationsClient is a mock of OperationsClient interface
-type MockOperationsClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockOperationsClientMockRecorder
-}
-
-// MockOperationsClientMockRecorder is the mock recorder for MockOperationsClient
-type MockOperationsClientMockRecorder struct {
-	mock *MockOperationsClient
-}
-
-// NewMockOperationsClient creates a new mock instance
-func NewMockOperationsClient(ctrl *gomock.Controller) *MockOperationsClient {
-	mock := &MockOperationsClient{ctrl: ctrl}
-	mock.recorder = &MockOperationsClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockOperationsClient) EXPECT() *MockOperationsClientMockRecorder {
-	return m.recorder
-}
-
-// List mocks base method
-func (m *MockOperationsClient) List(arg0 context.Context) ([]redhatopenshift.Operation, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "List", arg0)
-	ret0, _ := ret[0].([]redhatopenshift.Operation)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// List indicates an expected call of List
-func (mr *MockOperationsClientMockRecorder) List(arg0 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockOperationsClient)(nil).List), arg0)
-}
diff --git a/pkg/util/mocks/azureclient/mgmt/msi/msi.go b/pkg/util/mocks/azureclient/mgmt/msi/msi.go
deleted file mode 100644
index 8d04c30b6..000000000
--- a/pkg/util/mocks/azureclient/mgmt/msi/msi.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/msi (interfaces: UserAssignedIdentitiesClient)
-
-// Package mock_msi is a generated GoMock package.
-package mock_msi
-
-import (
-	context "context"
-	reflect "reflect"
-
-	msi "github.com/Azure/azure-sdk-for-go/services/msi/mgmt/2018-11-30/msi"
-	gomock "github.com/golang/mock/gomock"
-)
-
-// MockUserAssignedIdentitiesClient is a mock of UserAssignedIdentitiesClient interface
-type MockUserAssignedIdentitiesClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockUserAssignedIdentitiesClientMockRecorder
-}
-
-// MockUserAssignedIdentitiesClientMockRecorder is the mock recorder for MockUserAssignedIdentitiesClient
-type MockUserAssignedIdentitiesClientMockRecorder struct {
-	mock *MockUserAssignedIdentitiesClient
-}
-
-// NewMockUserAssignedIdentitiesClient creates a new mock instance
-func NewMockUserAssignedIdentitiesClient(ctrl *gomock.Controller) *MockUserAssignedIdentitiesClient {
-	mock := &MockUserAssignedIdentitiesClient{ctrl: ctrl}
-	mock.recorder = &MockUserAssignedIdentitiesClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockUserAssignedIdentitiesClient) EXPECT() *MockUserAssignedIdentitiesClientMockRecorder {
-	return m.recorder
-}
-
-// Get mocks base method
-func (m *MockUserAssignedIdentitiesClient) Get(arg0 context.Context, arg1, arg2 string) (msi.Identity, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Get", arg0, arg1, arg2)
-	ret0, _ := ret[0].(msi.Identity)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// Get indicates an expected call of Get
-func (mr *MockUserAssignedIdentitiesClientMockRecorder) Get(arg0, arg1, arg2 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockUserAssignedIdentitiesClient)(nil).Get), arg0, arg1, arg2)
-}
diff --git a/pkg/util/mocks/azureclient/mgmt/privatedns/privatedns.go b/pkg/util/mocks/azureclient/mgmt/privatedns/privatedns.go
deleted file mode 100644
index 8e29d7ab9..000000000
--- a/pkg/util/mocks/azureclient/mgmt/privatedns/privatedns.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/privatedns (interfaces: VirtualNetworkLinksClient)
-
-// Package mock_privatedns is a generated GoMock package.
-package mock_privatedns
-
-import (
-	context "context"
-	reflect "reflect"
-
-	privatedns "github.com/Azure/azure-sdk-for-go/services/privatedns/mgmt/2018-09-01/privatedns"
-	gomock "github.com/golang/mock/gomock"
-)
-
-// MockVirtualNetworkLinksClient is a mock of VirtualNetworkLinksClient interface
-type MockVirtualNetworkLinksClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockVirtualNetworkLinksClientMockRecorder
-}
-
-// MockVirtualNetworkLinksClientMockRecorder is the mock recorder for MockVirtualNetworkLinksClient
-type MockVirtualNetworkLinksClientMockRecorder struct {
-	mock *MockVirtualNetworkLinksClient
-}
-
-// NewMockVirtualNetworkLinksClient creates a new mock instance
-func NewMockVirtualNetworkLinksClient(ctrl *gomock.Controller) *MockVirtualNetworkLinksClient {
-	mock := &MockVirtualNetworkLinksClient{ctrl: ctrl}
-	mock.recorder = &MockVirtualNetworkLinksClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockVirtualNetworkLinksClient) EXPECT() *MockVirtualNetworkLinksClientMockRecorder {
-	return m.recorder
-}
-
-// DeleteAndWait mocks base method
-func (m *MockVirtualNetworkLinksClient) DeleteAndWait(arg0 context.Context, arg1, arg2, arg3, arg4 string) error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "DeleteAndWait", arg0, arg1, arg2, arg3, arg4)
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// DeleteAndWait indicates an expected call of DeleteAndWait
-func (mr *MockVirtualNetworkLinksClientMockRecorder) DeleteAndWait(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAndWait", reflect.TypeOf((*MockVirtualNetworkLinksClient)(nil).DeleteAndWait), arg0, arg1, arg2, arg3, arg4)
-}
-
-// List mocks base method
-func (m *MockVirtualNetworkLinksClient) List(arg0 context.Context, arg1, arg2 string, arg3 *int32) ([]privatedns.VirtualNetworkLink, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "List", arg0, arg1, arg2, arg3)
-	ret0, _ := ret[0].([]privatedns.VirtualNetworkLink)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// List indicates an expected call of List
-func (mr *MockVirtualNetworkLinksClientMockRecorder) List(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockVirtualNetworkLinksClient)(nil).List), arg0, arg1, arg2, arg3)
-}
diff --git a/pkg/util/mocks/azureclient/mgmt/storage/storage.go b/pkg/util/mocks/azureclient/mgmt/storage/storage.go
deleted file mode 100644
index 6809383aa..000000000
--- a/pkg/util/mocks/azureclient/mgmt/storage/storage.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: github.com/Azure/ARO-RP/pkg/util/azureclient/mgmt/storage (interfaces: AccountsClient)
-
-// Package mock_storage is a generated GoMock package.
-package mock_storage
-
-import (
-	context "context"
-	reflect "reflect"
-
-	storage "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-04-01/storage"
-	gomock "github.com/golang/mock/gomock"
-)
-
-// MockAccountsClient is a mock of AccountsClient interface
-type MockAccountsClient struct {
-	ctrl     *gomock.Controller
-	recorder *MockAccountsClientMockRecorder
-}
-
-// MockAccountsClientMockRecorder is the mock recorder for MockAccountsClient
-type MockAccountsClientMockRecorder struct {
-	mock *MockAccountsClient
-}
-
-// NewMockAccountsClient creates a new mock instance
-func NewMockAccountsClient(ctrl *gomock.Controller) *MockAccountsClient {
-	mock := &MockAccountsClient{ctrl: ctrl}
-	mock.recorder = &MockAccountsClientMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use
-func (m *MockAccountsClient) EXPECT() *MockAccountsClientMockRecorder {
-	return m.recorder
-}
-
-// CreateAndWait mocks base method
-func (m *MockAccountsClient) CreateAndWait(arg0 context.Context, arg1, arg2 string, arg3 storage.AccountCreateParameters) error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "CreateAndWait", arg0, arg1, arg2, arg3)
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// CreateAndWait indicates an expected call of CreateAndWait
-func (mr *MockAccountsClientMockRecorder) CreateAndWait(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAndWait", reflect.TypeOf((*MockAccountsClient)(nil).CreateAndWait), arg0, arg1, arg2, arg3)
-}
-
-// ListAccountSAS mocks base method
-func (m *MockAccountsClient) ListAccountSAS(arg0 context.Context, arg1, arg2 string, arg3 storage.AccountSasParameters) (storage.ListAccountSasResponse, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListAccountSAS", arg0, arg1, arg2, arg3)
-	ret0, _ := ret[0].(storage.ListAccountSasResponse)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListAccountSAS indicates an expected call of ListAccountSAS
-func (mr *MockAccountsClientMockRecorder) ListAccountSAS(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAccountSAS", reflect.TypeOf((*MockAccountsClient)(nil).ListAccountSAS), arg0, arg1, arg2, arg3)
-}
-
-// ListByResourceGroup mocks base method
-func (m *MockAccountsClient) ListByResourceGroup(arg0 context.Context, arg1 string) (storage.AccountListResult, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListByResourceGroup", arg0, arg1)
-	ret0, _ := ret[0].(storage.AccountListResult)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListByResourceGroup indicates an expected call of ListByResourceGroup
-func (mr *MockAccountsClientMockRecorder) ListByResourceGroup(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByResourceGroup", reflect.TypeOf((*MockAccountsClient)(nil).ListByResourceGroup), arg0, arg1)
-}
-
-// ListKeys mocks base method
-func (m *MockAccountsClient) ListKeys(arg0 context.Context, arg1, arg2 string, arg3 storage.ListKeyExpand) (storage.AccountListKeysResult, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ListKeys", arg0, arg1, arg2, arg3)
-	ret0, _ := ret[0].(storage.AccountListKeysResult)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// ListKeys indicates an expected call of ListKeys
-func (mr *MockAccountsClientMockRecorder) ListKeys(arg0, arg1, arg2, arg3 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListKeys", reflect.TypeOf((*MockAccountsClient)(nil).ListKeys), arg0, arg1, arg2, arg3)
-}
diff --git a/pkg/util/mocks/env/env.go b/pkg/util/mocks/env/env.go
index 0ad6e1b85..44636e895 100644
--- a/pkg/util/mocks/env/env.go
+++ b/pkg/util/mocks/env/env.go
@@ -17,6 +17,7 @@ import (
 
 	clientauthorizer "github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	deployment "github.com/Azure/ARO-RP/pkg/util/deployment"
+	keyvault "github.com/Azure/ARO-RP/pkg/util/keyvault"
 	refreshable "github.com/Azure/ARO-RP/pkg/util/refreshable"
 )
 
@@ -156,18 +157,18 @@ func (mr *MockInterfaceMockRecorder) ClustersGenevaLoggingSecret() *gomock.Call
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClustersGenevaLoggingSecret", reflect.TypeOf((*MockInterface)(nil).ClustersGenevaLoggingSecret))
 }
 
-// ClustersKeyvaultURI mocks base method
-func (m *MockInterface) ClustersKeyvaultURI() string {
+// ClustersKeyvault mocks base method
+func (m *MockInterface) ClustersKeyvault() keyvault.Manager {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ClustersKeyvaultURI")
-	ret0, _ := ret[0].(string)
+	ret := m.ctrl.Call(m, "ClustersKeyvault")
+	ret0, _ := ret[0].(keyvault.Manager)
 	return ret0
 }
 
-// ClustersKeyvaultURI indicates an expected call of ClustersKeyvaultURI
-func (mr *MockInterfaceMockRecorder) ClustersKeyvaultURI() *gomock.Call {
+// ClustersKeyvault indicates an expected call of ClustersKeyvault
+func (mr *MockInterfaceMockRecorder) ClustersKeyvault() *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClustersKeyvaultURI", reflect.TypeOf((*MockInterface)(nil).ClustersKeyvaultURI))
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClustersKeyvault", reflect.TypeOf((*MockInterface)(nil).ClustersKeyvault))
 }
 
 // CreateARMResourceGroupRoleAssignment mocks base method
@@ -256,37 +257,6 @@ func (mr *MockInterfaceMockRecorder) FPAuthorizer(arg0, arg1 interface{}) *gomoc
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FPAuthorizer", reflect.TypeOf((*MockInterface)(nil).FPAuthorizer), arg0, arg1)
 }
 
-// GetBase64Secret mocks base method
-func (m *MockInterface) GetBase64Secret(arg0 context.Context, arg1 string) ([]byte, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "GetBase64Secret", arg0, arg1)
-	ret0, _ := ret[0].([]byte)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// GetBase64Secret indicates an expected call of GetBase64Secret
-func (mr *MockInterfaceMockRecorder) GetBase64Secret(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBase64Secret", reflect.TypeOf((*MockInterface)(nil).GetBase64Secret), arg0, arg1)
-}
-
-// GetCertificateSecret mocks base method
-func (m *MockInterface) GetCertificateSecret(arg0 context.Context, arg1 string) (*rsa.PrivateKey, []*x509.Certificate, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "GetCertificateSecret", arg0, arg1)
-	ret0, _ := ret[0].(*rsa.PrivateKey)
-	ret1, _ := ret[1].([]*x509.Certificate)
-	ret2, _ := ret[2].(error)
-	return ret0, ret1, ret2
-}
-
-// GetCertificateSecret indicates an expected call of GetCertificateSecret
-func (mr *MockInterfaceMockRecorder) GetCertificateSecret(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCertificateSecret", reflect.TypeOf((*MockInterface)(nil).GetCertificateSecret), arg0, arg1)
-}
-
 // InitializeAuthorizers mocks base method
 func (m *MockInterface) InitializeAuthorizers() error {
 	m.ctrl.T.Helper()
@@ -359,6 +329,20 @@ func (mr *MockInterfaceMockRecorder) ResourceGroup() *gomock.Call {
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResourceGroup", reflect.TypeOf((*MockInterface)(nil).ResourceGroup))
 }
 
+// ServiceKeyvault mocks base method
+func (m *MockInterface) ServiceKeyvault() keyvault.Manager {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "ServiceKeyvault")
+	ret0, _ := ret[0].(keyvault.Manager)
+	return ret0
+}
+
+// ServiceKeyvault indicates an expected call of ServiceKeyvault
+func (mr *MockInterfaceMockRecorder) ServiceKeyvault() *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ServiceKeyvault", reflect.TypeOf((*MockInterface)(nil).ServiceKeyvault))
+}
+
 // SubscriptionID mocks base method
 func (m *MockInterface) SubscriptionID() string {
 	m.ctrl.T.Helper()


Test patch:
diff --git a/hack/e2e/run-rp-and-e2e.sh b/hack/e2e/run-rp-and-e2e.sh
index 42ff484e8..243cf2c60 100755
--- a/hack/e2e/run-rp-and-e2e.sh
+++ b/hack/e2e/run-rp-and-e2e.sh
@@ -38,14 +38,14 @@ kill_rp(){
 }
 
 deploy_e2e_db() {
-    echo "########## 📦 Creating new DB $DATABASE_NAME in $COSMOSDB_ACCOUNT ##########"
+    echo "########## 📦 Creating new DB $DATABASE_NAME in $DATABASE_ACCOUNT_NAME ##########"
 
     az deployment group create \
       -g "$RESOURCEGROUP" \
       -n "databases-development-$DATABASE_NAME" \
       --template-file deploy/databases-development.json \
       --parameters \
-        "databaseAccountName=$COSMOSDB_ACCOUNT" \
+        "databaseAccountName=$DATABASE_ACCOUNT_NAME" \
         "databaseName=$DATABASE_NAME" \
         >/dev/null
 
@@ -72,7 +72,7 @@ clean_e2e_db(){
     echo "########## 🧹 Deleting DB $DATABASE_NAME ##########"
     az cosmosdb sql database delete --name $DATABASE_NAME \
         --yes \
-        --account-name $COSMOSDB_ACCOUNT \
+        --account-name $DATABASE_ACCOUNT_NAME \
         --resource-group $RESOURCEGROUP >/dev/null
 }
 
@@ -96,7 +96,7 @@ echo "RP_MODE=$RP_MODE"
 if [ "$RP_MODE" = "development" ]
 then
     echo
-    echo "COSMOSDB_ACCOUNT=$COSMOSDB_ACCOUNT"
+    echo "DATABASE_ACCOUNT_NAME=$DATABASE_ACCOUNT_NAME"
     echo "DATABASE_NAME=$DATABASE_NAME"
     echo "RESOURCEGROUP=$RESOURCEGROUP"
 fi
@@ -115,7 +115,7 @@ if [ "$RP_MODE" = "development" ]
 then
     [ "$RESOURCEGROUP" ] || ( echo ">> RESOURCEGROUP is not set; please validate your ./secrets/env"; exit 128 )
     [ "$PROXY_HOSTNAME" ] || ( echo ">> PROXY_HOSTNAME is not set; please validate your ./secrets/env"; exit 128 )
-    [ "$COSMOSDB_ACCOUNT" ] || ( echo ">> COSMOSDB_ACCOUNT is not set; please validate your ./secrets/env"; exit 128 )
+    [ "$DATABASE_ACCOUNT_NAME" ] || ( echo ">> DATABASE_ACCOUNT_NAME is not set; please validate your ./secrets/env"; exit 128 )
     [ "$DATABASE_NAME" ] || ( echo ">> DATABASE_NAME is not set; please validate your ./secrets/env"; exit 128 )
 fi
 [ "$AZURE_SUBSCRIPTION_ID" ] || ( echo ">> AZURE_SUBSCRIPTION_ID is not set; please validate your ./secrets/env"; exit 128 )
diff --git a/pkg/api/validate/openshiftcluster_validatedynamic_test.go b/pkg/api/validate/openshiftcluster_validatedynamic_test.go
index ed68f952e..243663a6d 100644
--- a/pkg/api/validate/openshiftcluster_validatedynamic_test.go
+++ b/pkg/api/validate/openshiftcluster_validatedynamic_test.go
@@ -19,8 +19,8 @@ import (
 	"github.com/sirupsen/logrus"
 
 	"github.com/Azure/ARO-RP/pkg/api"
-	mockauthorization "github.com/Azure/ARO-RP/pkg/util/mocks/azureclient/mgmt/authorization"
-	mockfeatures "github.com/Azure/ARO-RP/pkg/util/mocks/azureclient/mgmt/features"
+	mock_authorization "github.com/Azure/ARO-RP/pkg/util/mocks/azureclient/mgmt/authorization"
+	mock_features "github.com/Azure/ARO-RP/pkg/util/mocks/azureclient/mgmt/features"
 	mockrefreshable "github.com/Azure/ARO-RP/pkg/util/mocks/refreshable"
 )
 
@@ -32,12 +32,12 @@ func TestValidateProviders(t *testing.T) {
 
 	for _, tt := range []struct {
 		name    string
-		mocks   func(*mockfeatures.MockProvidersClient)
+		mocks   func(*mock_features.MockProvidersClient)
 		wantErr string
 	}{
 		{
 			name: "all registered",
-			mocks: func(providersClient *mockfeatures.MockProvidersClient) {
+			mocks: func(providersClient *mock_features.MockProvidersClient) {
 				providersClient.EXPECT().
 					List(gomock.Any(), nil, "").
 					Return([]mgmtfeatures.Provider{
@@ -70,7 +70,7 @@ func TestValidateProviders(t *testing.T) {
 		},
 		{
 			name: "compute not registered",
-			mocks: func(providersClient *mockfeatures.MockProvidersClient) {
+			mocks: func(providersClient *mock_features.MockProvidersClient) {
 				providersClient.EXPECT().
 					List(gomock.Any(), nil, "").
 					Return([]mgmtfeatures.Provider{
@@ -104,7 +104,7 @@ func TestValidateProviders(t *testing.T) {
 		},
 		{
 			name: "storage missing",
-			mocks: func(providersClient *mockfeatures.MockProvidersClient) {
+			mocks: func(providersClient *mock_features.MockProvidersClient) {
 				providersClient.EXPECT().
 					List(gomock.Any(), nil, "").
 					Return([]mgmtfeatures.Provider{
@@ -134,7 +134,7 @@ func TestValidateProviders(t *testing.T) {
 		},
 		{
 			name: "error case",
-			mocks: func(providersClient *mockfeatures.MockProvidersClient) {
+			mocks: func(providersClient *mock_features.MockProvidersClient) {
 				providersClient.EXPECT().
 					List(gomock.Any(), nil, "").
 					Return(nil, errors.New("random error"))
@@ -143,7 +143,7 @@ func TestValidateProviders(t *testing.T) {
 		},
 	} {
 		t.Run(tt.name, func(t *testing.T) {
-			providerClient := mockfeatures.NewMockProvidersClient(controller)
+			providerClient := mock_features.NewMockProvidersClient(controller)
 
 			tt.mocks(providerClient)
 
@@ -449,12 +449,12 @@ func TestValidateVnetPermissions(t *testing.T) {
 
 	for _, tt := range []struct {
 		name    string
-		mocks   func(*mockauthorization.MockPermissionsClient, func())
+		mocks   func(*mock_authorization.MockPermissionsClient, func())
 		wantErr string
 	}{
 		{
 			name: "pass",
-			mocks: func(permissionsClient *mockauthorization.MockPermissionsClient, cancel func()) {
+			mocks: func(permissionsClient *mock_authorization.MockPermissionsClient, cancel func()) {
 				permissionsClient.EXPECT().
 					ListForResource(gomock.Any(), "", "", "", "", "").
 					Return([]mgmtauthorization.Permission{
@@ -474,7 +474,7 @@ func TestValidateVnetPermissions(t *testing.T) {
 		},
 		{
 			name: "fail: missing permissions",
-			mocks: func(permissionsClient *mockauthorization.MockPermissionsClient, cancel func()) {
+			mocks: func(permissionsClient *mock_authorization.MockPermissionsClient, cancel func()) {
 				permissionsClient.EXPECT().
 					ListForResource(gomock.Any(), "", "", "", "", "").
 					Do(func(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) {
@@ -494,7 +494,7 @@ func TestValidateVnetPermissions(t *testing.T) {
 		},
 		{
 			name: "fail: not found",
-			mocks: func(permissionsClient *mockauthorization.MockPermissionsClient, cancel func()) {
+			mocks: func(permissionsClient *mock_authorization.MockPermissionsClient, cancel func()) {
 				permissionsClient.EXPECT().
 					ListForResource(gomock.Any(), "", "", "", "", "").
 					Do(func(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) {
@@ -514,7 +514,7 @@ func TestValidateVnetPermissions(t *testing.T) {
 			ctx, cancel := context.WithCancel(ctx)
 			defer cancel()
 
-			permissionsClient := mockauthorization.NewMockPermissionsClient(controller)
+			permissionsClient := mock_authorization.NewMockPermissionsClient(controller)
 
 			tt.mocks(permissionsClient, cancel)
 
@@ -544,14 +544,14 @@ func TestValidateRouteTablePermissionsSubnet(t *testing.T) {
 
 	for _, tt := range []struct {
 		name    string
-		mocks   func(*mockauthorization.MockPermissionsClient, func())
+		mocks   func(*mock_authorization.MockPermissionsClient, func())
 		vnet    func(*mgmtnetwork.VirtualNetwork)
 		subnet  string
 		wantErr string
 	}{
 		{
 			name: "pass",
-			mocks: func(permissionsClient *mockauthorization.MockPermissionsClient, cancel func()) {
+			mocks: func(permissionsClient *mock_authorization.MockPermissionsClient, cancel func()) {
 				permissionsClient.EXPECT().
 					ListForResource(gomock.Any(), "testGroup", "Microsoft.Network", "", "routeTables", "testRT").
 					Return([]mgmtauthorization.Permission{
@@ -576,7 +576,7 @@ func TestValidateRouteTablePermissionsSubnet(t *testing.T) {
 		},
 		{
 			name: "fail: missing permissions",
-			mocks: func(permissionsClient *mockauthorization.MockPermissionsClient, cancel func()) {
+			mocks: func(permissionsClient *mock_authorization.MockPermissionsClient, cancel func()) {
 				permissionsClient.EXPECT().
 					ListForResource(gomock.Any(), "testGroup", "Microsoft.Network", "", "routeTables", "testRT").
 					Do(func(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) {
@@ -597,7 +597,7 @@ func TestValidateRouteTablePermissionsSubnet(t *testing.T) {
 		},
 		{
 			name: "fail: not found",
-			mocks: func(permissionsClient *mockauthorization.MockPermissionsClient, cancel func()) {
+			mocks: func(permissionsClient *mock_authorization.MockPermissionsClient, cancel func()) {
 				permissionsClient.EXPECT().
 					ListForResource(gomock.Any(), "testGroup", "Microsoft.Network", "", "routeTables", "testRT").
 					Do(func(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) {
@@ -638,7 +638,7 @@ func TestValidateRouteTablePermissionsSubnet(t *testing.T) {
 				},
 			}
 
-			permissionsClient := mockauthorization.NewMockPermissionsClient(controller)
+			permissionsClient := mock_authorization.NewMockPermissionsClient(controller)
 
 			if tt.mocks != nil {
 				tt.mocks(permissionsClient, cancel)
diff --git a/pkg/database/extensions_test.go b/pkg/database/extensions_test.go
index ccc5928e5..bd9dfb998 100644
--- a/pkg/database/extensions_test.go
+++ b/pkg/database/extensions_test.go
@@ -8,13 +8,10 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/golang/mock/gomock"
 	"github.com/ugorji/go/codec"
 
 	"github.com/Azure/ARO-RP/pkg/api"
-	"github.com/Azure/ARO-RP/pkg/env"
 	"github.com/Azure/ARO-RP/pkg/util/encryption"
-	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 )
 
 type testStruct struct {
@@ -27,13 +24,7 @@ type testStruct struct {
 func TestExtensions(t *testing.T) {
 	ctx := context.Background()
 
-	controller := gomock.NewController(t)
-	defer controller.Finish()
-
-	_env := mock_env.NewMockInterface(controller)
-	_env.EXPECT().GetBase64Secret(gomock.Any(), env.EncryptionSecretName).Return([]byte("\x63\xb5\x59\xf0\x43\x34\x79\x49\x68\x46\xab\x8b\xce\xdb\xc1\x2d\x7a\x0b\x14\x86\x7e\x1a\xb2\xd7\x3a\x92\x4e\x98\x6c\x5e\xcb\xe1"), nil)
-
-	cipher, err := encryption.NewXChaCha20Poly1305(ctx, _env, env.EncryptionSecretName)
+	cipher, err := encryption.NewXChaCha20Poly1305(ctx, []byte("\x63\xb5\x59\xf0\x43\x34\x79\x49\x68\x46\xab\x8b\xce\xdb\xc1\x2d\x7a\x0b\x14\x86\x7e\x1a\xb2\xd7\x3a\x92\x4e\x98\x6c\x5e\xcb\xe1"))
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/pkg/deploy/config_test.go b/pkg/deploy/config_test.go
index a1aac38ca..1d1910daf 100644
--- a/pkg/deploy/config_test.go
+++ b/pkg/deploy/config_test.go
@@ -123,7 +123,6 @@ func TestConfigRequiredValues(t *testing.T) {
 	DatabaseAccountName := "DatabaseAccountName"
 	FPServerCertCommonName := "FPServerCertCommonName"
 	FPServicePrincipalID := "FPServicePrincipalID"
-	GlobalMonitoringKeyVaultURI := "GlobalMonitoringKeyVaultURI"
 	GlobalResourceGroupName := "GlobalResourceGroupName"
 	GlobalResourceGroupLocation := "GlobalResourceGroupLocation"
 	GlobalSubscriptionID := "GlobalSubscriptionID"
@@ -161,7 +160,6 @@ func TestConfigRequiredValues(t *testing.T) {
 					ExtraServiceKeyvaultAccessPolicies: []interface{}{},
 					FPServerCertCommonName:             &FPServerCertCommonName,
 					FPServicePrincipalID:               &FPServicePrincipalID,
-					GlobalMonitoringKeyVaultURI:        &GlobalMonitoringKeyVaultURI,
 					GlobalResourceGroupName:            &GlobalResourceGroupName,
 					GlobalResourceGroupLocation:        &GlobalResourceGroupLocation,
 					GlobalSubscriptionID:               &GlobalSubscriptionID,
@@ -191,7 +189,7 @@ func TestConfigRequiredValues(t *testing.T) {
 					ExtraCosmosDBIPs: []string{ExtraCosmosDBIPs},
 				},
 			},
-			expect: fmt.Errorf("Configuration has missing fields: %s", "[RPVersionStorageAccountName AdminAPIClientCertCommonName ClusterParentDomainName DatabaseAccountName ExtraClusterKeyvaultAccessPolicies ExtraServiceKeyvaultAccessPolicies FPServicePrincipalID GlobalMonitoringKeyVaultURI GlobalResourceGroupName GlobalResourceGroupLocation GlobalSubscriptionID KeyvaultPrefix MDMFrontendURL MDSDConfigVersion MDSDEnvironment RPImagePrefix RPNSGSourceAddressPrefixes RPParentDomainName SubscriptionResourceGroupName SubscriptionResourceGroupLocation SSHPublicKey StorageAccountName VMSize]"),
+			expect: fmt.Errorf("Configuration has missing fields: %s", "[RPVersionStorageAccountName AdminAPIClientCertCommonName ClusterParentDomainName DatabaseAccountName ExtraClusterKeyvaultAccessPolicies ExtraServiceKeyvaultAccessPolicies FPServicePrincipalID GlobalResourceGroupName GlobalResourceGroupLocation GlobalSubscriptionID KeyvaultPrefix MDMFrontendURL MDSDConfigVersion MDSDEnvironment RPImagePrefix RPNSGSourceAddressPrefixes RPParentDomainName SubscriptionResourceGroupName SubscriptionResourceGroupLocation SSHPublicKey StorageAccountName VMSize]"),
 		},
 	} {
 		valid := tt.config.validate()
diff --git a/pkg/frontend/security_test.go b/pkg/frontend/security_test.go
index 6ef2ad922..ca58f1b55 100644
--- a/pkg/frontend/security_test.go
+++ b/pkg/frontend/security_test.go
@@ -21,6 +21,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
+	mock_keyvault "github.com/Azure/ARO-RP/pkg/util/mocks/keyvault"
 	utiltls "github.com/Azure/ARO-RP/pkg/util/tls"
 	"github.com/Azure/ARO-RP/test/util/listener"
 )
@@ -49,9 +50,12 @@ func TestSecurity(t *testing.T) {
 	controller := gomock.NewController(t)
 	defer controller.Finish()
 
+	keyvault := mock_keyvault.NewMockManager(controller)
+	keyvault.EXPECT().GetCertificateSecret(gomock.Any(), env.RPServerSecretName).AnyTimes().Return(serverkey, servercerts, nil)
+
 	_env := mock_env.NewMockInterface(controller)
 	_env.EXPECT().DeploymentMode().AnyTimes().Return(deployment.Production)
-	_env.EXPECT().GetCertificateSecret(gomock.Any(), env.RPServerSecretName).AnyTimes().Return(serverkey, servercerts, nil)
+	_env.EXPECT().ServiceKeyvault().AnyTimes().Return(keyvault)
 	_env.EXPECT().ArmClientAuthorizer().AnyTimes().Return(clientauthorizer.NewOne(validclientcerts[0].Raw))
 	_env.EXPECT().AdminClientAuthorizer().AnyTimes().Return(clientauthorizer.NewOne(validadminclientcerts[0].Raw))
 	_env.EXPECT().Listen().AnyTimes().Return(l, nil)
diff --git a/pkg/frontend/shared_test.go b/pkg/frontend/shared_test.go
index 57dd65ff8..18ddb9760 100644
--- a/pkg/frontend/shared_test.go
+++ b/pkg/frontend/shared_test.go
@@ -27,6 +27,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
+	mock_keyvault "github.com/Azure/ARO-RP/pkg/util/mocks/keyvault"
 	utiltls "github.com/Azure/ARO-RP/pkg/util/tls"
 	testdatabase "github.com/Azure/ARO-RP/test/database"
 	testclusterdata "github.com/Azure/ARO-RP/test/util/clusterdata"
@@ -80,10 +81,13 @@ func newTestInfra(t *testing.T) *testInfra {
 
 	controller := gomock.NewController(t)
 
+	keyvault := mock_keyvault.NewMockManager(controller)
+	keyvault.EXPECT().GetCertificateSecret(gomock.Any(), env.RPServerSecretName).AnyTimes().Return(serverkey, servercerts, nil)
+
 	_env := mock_env.NewMockInterface(controller)
 	_env.EXPECT().DeploymentMode().AnyTimes().Return(deployment.Production)
 	_env.EXPECT().Location().AnyTimes().Return("eastus")
-	_env.EXPECT().GetCertificateSecret(gomock.Any(), env.RPServerSecretName).AnyTimes().Return(serverkey, servercerts, nil)
+	_env.EXPECT().ServiceKeyvault().AnyTimes().Return(keyvault)
 	_env.EXPECT().ArmClientAuthorizer().AnyTimes().Return(clientauthorizer.NewOne(clientcerts[0].Raw))
 	_env.EXPECT().AdminClientAuthorizer().AnyTimes().Return(clientauthorizer.NewOne(clientcerts[0].Raw))
 	_env.EXPECT().Domain().AnyTimes().Return("")
diff --git a/pkg/util/encryption/xchacha20poly1305_test.go b/pkg/util/encryption/xchacha20poly1305_test.go
index 94ad0c66d..c109df94d 100644
--- a/pkg/util/encryption/xchacha20poly1305_test.go
+++ b/pkg/util/encryption/xchacha20poly1305_test.go
@@ -9,11 +9,6 @@ import (
 	"encoding/hex"
 	"fmt"
 	"testing"
-
-	"github.com/golang/mock/gomock"
-
-	"github.com/Azure/ARO-RP/pkg/env"
-	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 )
 
 func TestNewXChaCha20Poly1305(t *testing.T) {
@@ -38,13 +33,7 @@ func TestNewXChaCha20Poly1305(t *testing.T) {
 		},
 	} {
 		t.Run(tt.name, func(t *testing.T) {
-			controller := gomock.NewController(t)
-			defer controller.Finish()
-
-			_env := mock_env.NewMockInterface(controller)
-			_env.EXPECT().GetBase64Secret(gomock.Any(), env.EncryptionSecretName).Return(tt.key, nil)
-
-			_, err := NewXChaCha20Poly1305(context.Background(), _env, env.EncryptionSecretName)
+			_, err := NewXChaCha20Poly1305(context.Background(), tt.key)
 			if err != nil && err.Error() != tt.wantErr ||
 				err == nil && tt.wantErr != "" {
 				t.Fatal(err)
@@ -81,13 +70,7 @@ func TestXChaCha20Poly1305Decrypt(t *testing.T) {
 		},
 	} {
 		t.Run(tt.name, func(t *testing.T) {
-			controller := gomock.NewController(t)
-			defer controller.Finish()
-
-			_env := mock_env.NewMockInterface(controller)
-			_env.EXPECT().GetBase64Secret(gomock.Any(), env.EncryptionSecretName).Return(tt.key, nil)
-
-			cipher, err := NewXChaCha20Poly1305(context.Background(), _env, env.EncryptionSecretName)
+			cipher, err := NewXChaCha20Poly1305(context.Background(), tt.key)
 			if err != nil {
 				t.Fatal(err)
 			}
@@ -135,13 +118,7 @@ func TestXChaCha20Poly1305Encrypt(t *testing.T) {
 		},
 	} {
 		t.Run(tt.name, func(t *testing.T) {
-			controller := gomock.NewController(t)
-			defer controller.Finish()
-
-			_env := mock_env.NewMockInterface(controller)
-			_env.EXPECT().GetBase64Secret(gomock.Any(), env.EncryptionSecretName).Return(tt.key, nil)
-
-			cipher, err := NewXChaCha20Poly1305(context.Background(), _env, env.EncryptionSecretName)
+			cipher, err := NewXChaCha20Poly1305(context.Background(), tt.key)
 			if err != nil {
 				t.Fatal(err)
 			}