Repository: Azure/ARO-RP
Pull request #1243 (2021-01-06 18:35:46)

Collect Audit Logs From RP Frontend
### Which issue this PR addresses:

Part of [7311453](https://msazure.visualstudio.com/AzureRedHatOpenShift/_boards/board/t/Azure%20Red%20Hat%20OpenShift/Features/?workitem=7311453).

### What this PR does / why we need it:

There are 2 parts to this PR.

#### Go middleware

This PR introduces a new `audit` middleware that intercepts and audits 
all inbound HTTP requests to the RP `frontend`. It follows the `log` 
middleware pattern, and relies on `log` to set some of the audit-relevant
data in the request context.

Requests to the `operationstatuses` endpoints are skipped.

#### Fluent Bit Configuration

The RP's Fluent Bit configuration has been updated with a `rewrite_tag`
input filter, where journals logs with the field `LOGKIND=ifaudit` are 
retagged with a `ifxaudit` tag. This rewrite enables us to separate ifxaudit
logs from non-audit logs in Geneva Logs.

### Test plan for issue:

* Updated unit tests in `pkg/util/log/audit` and `pkg/frontend`.

* For sample logs output generated by the `audit` middleware, see comments
in the [VSTS story](https://msazure.visualstudio.com/AzureRedHatOpenShift/_boards/board/t/Azure%20Red%20Hat%20OpenShift/Features/?workitem=7311453).

* For testing the Fluent Bit config changes, I ran the td-agent process locally
following the installation steps [here](https://docs.fluentbit.io/manual/installation/linux/redhat-centos) with the following config:

```
[SERVICE]
	Flush 1

# this input is the same as that in the current RP td-agent
[INPUT]
	Name systemd
	Tag journald
	Systemd_Filter _COMM=aro

[FILTER]
	Name modify
	Match journald
	Remove_wildcard _
	Remove TIMESTAMP

# this is the new rewrite_tag filter
[FILTER]
	Name rewrite_tag
	Match journald
	Rule $LOGKIND ifxaudit ifxaudit false
	Emitter_Name ifxaudit

# for testing purposes, output the ifxaudit logs and non-audit logs to
# different files to emulate the different mdsd storage containers
[OUTPUT]
        Name file
        Match ifxaudit
        Path /tmp
        File ifxaudit.log

[OUTPUT]
        Name file
        Match journals
        Path /tmp
        File aro-rp.log
```

Sample log outputs are uploaded to the VSTS story.

### Is there any documentation that needs to be updated for this PR?

No.

github-actions[bot]: Please rebase pull request.
github-actions[bot]: Please rebase pull request.

Patch:
diff --git a/cmd/aro/main.go b/cmd/aro/main.go
index e256930e5..b6dc42dca 100644
--- a/cmd/aro/main.go
+++ b/cmd/aro/main.go
@@ -37,6 +37,7 @@ func main() {
 	flag.Parse()
 
 	ctx := context.Background()
+	audit := utillog.GetAuditEntry()
 	log := utillog.GetLogger()
 
 	go func() {
@@ -58,7 +59,7 @@ func main() {
 		err = monitor(ctx, log)
 	case "rp":
 		checkArgs(1)
-		err = rp(ctx, log)
+		err = rp(ctx, log, audit)
 	case "portal":
 		checkArgs(1)
 		err = portal(ctx, log)
diff --git a/cmd/aro/rp.go b/cmd/aro/rp.go
index 6399370f4..31cb67791 100644
--- a/cmd/aro/rp.go
+++ b/cmd/aro/rp.go
@@ -32,7 +32,7 @@ import (
 	"github.com/Azure/ARO-RP/pkg/util/encryption"
 )
 
-func rp(ctx context.Context, log *logrus.Entry) error {
+func rp(ctx context.Context, log, audit *logrus.Entry) error {
 	_env, err := env.NewEnv(ctx, log)
 	if err != nil {
 		return err
@@ -121,7 +121,7 @@ func rp(ctx context.Context, log *logrus.Entry) error {
 		return err
 	}
 
-	f, err := frontend.NewFrontend(ctx, log.WithField("component", "frontend"), _env, dbAsyncOperations, dbOpenShiftClusters, dbSubscriptions, api.APIs, m, feAead, adminactions.NewKubeActions, adminactions.NewAzureActions, clusterdata.NewBestEffortEnricher)
+	f, err := frontend.NewFrontend(ctx, audit, log.WithField("component", "frontend"), _env, dbAsyncOperations, dbOpenShiftClusters, dbSubscriptions, api.APIs, m, feAead, adminactions.NewKubeActions, adminactions.NewAzureActions, clusterdata.NewBestEffortEnricher)
 	if err != nil {
 		return err
 	}
diff --git a/deploy/rp-production.json b/deploy/rp-production.json
index d0f0dddcb..62a1d0338 100644
--- a/deploy/rp-production.json
+++ b/deploy/rp-production.json
@@ -326,7 +326,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','CLUSTERPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterParentDomainName')),''')\n','PORTALACCESSGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalAccessGroupIds')),''')\n','PORTALCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalClientId')),''')\n','PORTALELEVATEDGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalElevatedGroupIds')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMODE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMode')),''')\n','RPPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpParentDomainName')),''')\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_52''\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+b3BlbjogQkRCMDA5MSBEQl9WRVJTSU9OX01JU01BVENIOiBEYXRhYmFzZSBlbnZpcm9ubWVudCB2ZXJzaW9uIG1pc21hdGNoIgpybSAtZiAvdmFyL2xpYi9ycG0vX19kYioKCnJwbSAtLWltcG9ydCBodHRwczovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsL1JQTS1HUEctS0VZLUVQRUwtNwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5mbHVlbnRiaXQuaW8vZmx1ZW50Yml0LmtleQoKZm9yIGF0dGVtcHQgaW4gezEuLjV9OyBkbwogIHl1bSAteSBpbnN0YWxsIGh0dHBzOi8vZGwuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvZXBlbC1yZWxlYXNlLWxhdGVzdC03Lm5vYXJjaC5ycG0gJiYgYnJlYWsKICBpZiBbWyAke2F0dGVtcHR9IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKY2F0ID4vZXRjL3l1bS5yZXBvcy5kL2F6dXJlLnJlcG8gPDwnRU9GJwpbYXp1cmUtY2xpXQpuYW1lPWF6dXJlLWNsaQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZS1jbGkKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9eWVzCgpbYXp1cmVjb3JlXQpuYW1lPWF6dXJlY29yZQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZWNvcmUKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9bm8KRU9GCgpjYXQgPi9ldGMveXVtLnJlcG9zLmQvdGQtYWdlbnQtYml0LnJlcG8gPDwnRU9GJwpbdGQtYWdlbnQtYml0XQpuYW1lPXRkLWFnZW50LWJpdApiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMuZmx1ZW50Yml0LmlvL2NlbnRvcy83CmVuYWJsZWQ9eWVzCmdwZ2NoZWNrPXllcwpFT0YKCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KeXVtIC0tZW5hYmxlcmVwbz1yaHVpLXJoZWwtNy1zZXJ2ZXItcmh1aS1vcHRpb25hbC1ycG1zIC15IGluc3RhbGwgYXpzZWMtY2xhbWF2IGF6c2VjLW1vbml0b3IgYXp1cmUtY2xpLTIuMTAuMSBhenVyZS1tZHNkIGF6dXJlLXNlY3VyaXR5IGRvY2tlciBvcGVuc3NsLXBlcmwgdGQtYWdlbnQtYml0ICYmIGJyZWFrCiAgaWYgW1sgJHthdHRlbXB0fSAtbHQgNSBdXTsgdGhlbiBzbGVlcCAxMDsgZWxzZSBleGl0IDE7IGZpCmRvbmUKCnJwbSAtZSAkKHJwbSAtcWEgfCBncmVwIF5hYnJ0LSkKY2F0ID4vZXRjL3N5c2N0bC5kLzAxLWRpc2FibGUtY29yZS5jb25mIDw8J0VPRicKa2VybmVsLmNvcmVfcGF0dGVybiA9IHwvYmluL3RydWUKRU9GCnN5c2N0bCAtLXN5c3RlbQoKZmlyZXdhbGwtY21kIC0tYWRkLXBvcnQ9NDQzL3RjcCAtLXBlcm1hbmVudApmaXJld2FsbC1jbWQgLS1hZGQtcG9ydD00NDQvdGNwIC0tcGVybWFuZW50CmZpcmV3YWxsLWNtZCAtLWFkZC1wb3J0PTIyMjIvdGNwIC0tcGVybWFuZW50CgpjYXQgPi9ldGMvdGQtYWdlbnQtYml0L3RkLWFnZW50LWJpdC5jb25mIDw8J0VPRicKW0lOUFVUXQoJTmFtZSBzeXN0ZW1kCglUYWcgam91cm5hbGQKCVN5c3RlbWRfRmlsdGVyIF9DT01NPWFybwoKW0ZJTFRFUl0KCU5hbWUgbW9kaWZ5CglNYXRjaCBqb3VybmFsZAoJUmVtb3ZlX3dpbGRjYXJkIF8KCVJlbW92ZSBUSU1FU1RBTVAKCltPVVRQVVRdCglOYW1lIGZvcndhcmQKCVBvcnQgMjkyMzAKRU9GCgpheiBsb2dpbiAtaQpheiBhY2NvdW50IHNldCAtcyAiJFNVQlNDUklQVElPTklEIgoKc3lzdGVtY3RsIHN0YXJ0IGRvY2tlci5zZXJ2aWNlCmF6IGFjciBsb2dpbiAtLW5hbWUgIiQoc2VkIC1lICdzfC4qL3x8JyA8PDwiJEFDUlJFU09VUkNFSUQiKSIKCk1ETUlNQUdFPSIke1JQSU1BR0UlJS8qfS8ke01ETUlNQUdFIyMqL30iCmRvY2tlciBwdWxsICIkTURNSU1BR0UiCmRvY2tlciBwdWxsICIkUlBJTUFHRSIKCmF6IGxvZ291dAoKbWtkaXIgL2V0Yy9hcm8tcnAKYmFzZTY0IC1kIDw8PCIkQURNSU5BUElDQUJVTkRMRSIgPi9ldGMvYXJvLXJwL2FkbWluLWNhLWJ1bmRsZS5wZW0KY2hvd24gLVIgMTAwMDoxMDAwIC9ldGMvYXJvLXJwCgpjYXQgPi9ldGMvc3lzY29uZmlnL21kbSA8PEVPRgpNRE1GUk9OVEVORFVSTD0nJE1ETUZST05URU5EVVJMJwpNRE1JTUFHRT0nJE1ETUlNQUdFJwpNRE1TT1VSQ0VFTlZJUk9OTUVOVD0nJExPQ0FUSU9OJwpNRE1TT1VSQ0VST0xFPXJwCk1ETVNPVVJDRVJPTEVJTlNUQU5DRT0nJChob3N0bmFtZSknCkVPRgoKbWtkaXIgL3Zhci9ldHcKY2F0ID4vZXRjL3N5c3RlbWQvc3lzdGVtL21kbS5zZXJ2aWNlIDw8J0VPRicKW1VuaXRdCkFmdGVyPWRvY2tlci5zZXJ2aWNlClJlcXVpcmVzPWRvY2tlci5zZXJ2aWNlCgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL21kbQpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1lbnRyeXBvaW50IC91c3Ivc2Jpbi9NZXRyaWNzRXh0ZW5zaW9uIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC1tIDJnIFwKICAtdiAvZXRjL21kbS5wZW06L2V0Yy9tZG0ucGVtIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkTURNSU1BR0UgXAogIC1DZXJ0RmlsZSAvZXRjL21kbS5wZW0gXAogIC1Gcm9udEVuZFVybCAkTURNRlJPTlRFTkRVUkwgXAogIC1Mb2dnZXIgQ29uc29sZSBcCiAgLUxvZ0xldmVsIFdhcm5pbmcgXAogIC1Qcml2YXRlS2V5RmlsZSAvZXRjL21kbS5wZW0gXAogIC1Tb3VyY2VFbnZpcm9ubWVudCAkTURNU09VUkNFRU5WSVJPTk1FTlQgXAogIC1Tb3VyY2VSb2xlICRNRE1TT1VSQ0VST0xFIFwKICAtU291cmNlUm9sZUluc3RhbmNlICRNRE1TT1VSQ0VST0xFSU5TVEFOQ0UKRXhlY1N0b3A9L3Vzci9iaW4vZG9ja2VyIHN0b3AgJU4KUmVzdGFydD1hbHdheXMKUmVzdGFydFNlYz0xClN0YXJ0TGltaXRJbnRlcnZhbD0wCgpbSW5zdGFsbF0KV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQKRU9GCgpjYXQgPi9ldGMvc3lzY29uZmlnL2Fyby1ycCA8PEVPRgpBQ1JfUkVTT1VSQ0VfSUQ9JyRBQ1JSRVNPVVJDRUlEJwpBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUU9JyRBRE1JTkFQSUNMSUVOVENFUlRDT01NT05OQU1FJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpET01BSU5fTkFNRT0nJExPQ0FUSU9OLiRDTFVTVEVSUEFSRU5URE9NQUlOTkFNRScKS0VZVkFVTFRfUFJFRklYPSckS0VZVkFVTFRQUkVGSVgnCk1ETV9BQ0NPVU5UPUF6dXJlUmVkSGF0T3BlblNoaWZ0UlAKTURNX05BTUVTUEFDRT1SUApSUF9NT0RFPSckUlBNT0RFJwpSUElNQUdFPSckUlBJTUFHRScKRU9GCgpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLXJwLnNlcnZpY2UgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKUmVxdWlyZXM9ZG9ja2VyLnNlcnZpY2UKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvYXJvLXJwCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC1lIEFDUl9SRVNPVVJDRV9JRCBcCiAgLWUgQURNSU5fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FIFwKICAtZSBEQVRBQkFTRV9BQ0NPVU5UX05BTUUgXAogIC1lIERPTUFJTl9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBSUF9NT0RFIFwKICAtbSAyZyBcCiAgLXAgNDQzOjg0NDMgXAogIC12IC9ldGMvYXJvLXJwOi9ldGMvYXJvLXJwIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJFJQSU1BR0UgXAogIHJwCkV4ZWNTdG9wPS91c3IvYmluL2RvY2tlciBzdG9wIC10IDM2MDAgJU4KVGltZW91dFN0b3BTZWM9MzYwMApSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvYXJvLW1vbml0b3IgPDxFT0YKQ0xVU1RFUl9NRE1fQUNDT1VOVD1BenVyZVJlZEhhdE9wZW5TaGlmdENsdXN0ZXIKQ0xVU1RFUl9NRE1fTkFNRVNQQUNFPUJCTQpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpLRVlWQVVMVF9QUkVGSVg9JyRLRVlWQVVMVFBSRUZJWCcKTURNX0FDQ09VTlQ9QXp1cmVSZWRIYXRPcGVuU2hpZnRSUApNRE1fTkFNRVNQQUNFPUJCTQpSUF9NT0RFPSckUlBNT0RFJwpSUElNQUdFPSckUlBJTUFHRScKRU9GCgpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLW1vbml0b3Iuc2VydmljZSA8PCdFT0YnCltVbml0XQpBZnRlcj1kb2NrZXIuc2VydmljZQpSZXF1aXJlcz1kb2NrZXIuc2VydmljZQoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tbW9uaXRvcgpFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtZSBDTFVTVEVSX01ETV9BQ0NPVU5UIFwKICAtZSBDTFVTVEVSX01ETV9OQU1FU1BBQ0UgXAogIC1lIERBVEFCQVNFX0FDQ09VTlRfTkFNRSBcCiAgLWUgS0VZVkFVTFRfUFJFRklYIFwKICAtZSBNRE1fQUNDT1VOVCBcCiAgLWUgTURNX05BTUVTUEFDRSBcCiAgLWUgUlBfTU9ERSBcCiAgLW0gMmcgXAogIC12IC9ydW4vc3lzdGVtZC9qb3VybmFsOi9ydW4vc3lzdGVtZC9qb3VybmFsIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkUlBJTUFHRSBcCiAgbW9uaXRvcgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvYXJvLXBvcnRhbCA8PEVPRgpBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUz0nJFBPUlRBTEFDQ0VTU0dST1VQSURTJwpBWlVSRV9QT1JUQUxfQ0xJRU5UX0lEPSckUE9SVEFMQ0xJRU5USUQnCkFaVVJFX1BPUlRBTF9FTEVWQVRFRF9HUk9VUF9JRFM9JyRQT1JUQUxFTEVWQVRFREdST1VQSURTJwpEQVRBQkFTRV9BQ0NPVU5UX05BTUU9JyREQVRBQkFTRUFDQ09VTlROQU1FJwpLRVlWQVVMVF9QUkVGSVg9JyRLRVlWQVVMVFBSRUZJWCcKTURNX0FDQ09VTlQ9QXp1cmVSZWRIYXRPcGVuU2hpZnRSUApNRE1fTkFNRVNQQUNFPVBvcnRhbApQT1JUQUxfSE9TVE5BTUU9JyRMT0NBVElPTi5hZG1pbi4kUlBQQVJFTlRET01BSU5OQU1FJwpSUF9NT0RFPSckUlBNT0RFJwpSUElNQUdFPSckUlBJTUFHRScKRU9GCgpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vYXJvLXBvcnRhbC5zZXJ2aWNlIDw8J0VPRicKW1VuaXRdCkFmdGVyPWRvY2tlci5zZXJ2aWNlClJlcXVpcmVzPWRvY2tlci5zZXJ2aWNlClN0YXJ0TGltaXRJbnRlcnZhbD0wCgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL2Fyby1wb3J0YWwKRXhlY1N0YXJ0UHJlPS0vdXNyL2Jpbi9kb2NrZXIgcm0gLWYgJU4KRXhlY1N0YXJ0PS91c3IvYmluL2RvY2tlciBydW4gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLWUgQURNSU5fQVBJX0NMSUVOVF9DRVJUX0NPTU1PTl9OQU1FIFwKICAtZSBBWlVSRV9QT1JUQUxfQUNDRVNTX0dST1VQX0lEUyBcCiAgLWUgQVpVUkVfUE9SVEFMX0NMSUVOVF9JRCBcCiAgLWUgQVpVUkVfUE9SVEFMX0VMRVZBVEVEX0dST1VQX0lEUyBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBQT1JUQUxfSE9TVE5BTUUgXAogIC1lIFJQX01PREUgXAogIC1tIDJnIFwKICAtcCA0NDQ6ODQ0NCBcCiAgLXAgMjIyMjoyMjIyIFwKICAtdiAvcnVuL3N5c3RlbWQvam91cm5hbDovcnVuL3N5c3RlbWQvam91cm5hbCBcCiAgLXYgL3Zhci9ldHc6L3Zhci9ldHc6eiBcCiAgJFJQSU1BR0UgXAogIHBvcnRhbApSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNoY29uIC1SIHN5c3RlbV91Om9iamVjdF9yOnZhcl9sb2dfdDpzMCAvdmFyL29wdC9taWNyb3NvZnQvbGludXhtb25hZ2VudAoKbWtkaXIgLXAgL3Zhci9saWIvd2FhZ2VudC9NaWNyb3NvZnQuQXp1cmUuS2V5VmF1bHQuU3RvcmUKCmZvciB2YXIgaW4gIm1kc2QiICJtZG0iOyBkbwpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vZG93bmxvYWQtJHZhci1jcmVkZW50aWFscy5zZXJ2aWNlIDw8RU9GCltVbml0XQpEZXNjcmlwdGlvbj1QZXJpb2RpYyAkdmFyIGNyZWRlbnRpYWxzIHJlZnJlc2gKCltTZXJ2aWNlXQpUeXBlPW9uZXNob3QKRXhlY1N0YXJ0PS91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoICR2YXIKRU9GCgpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vZG93bmxvYWQtJHZhci1jcmVkZW50aWFscy50aW1lciA8PEVPRgpbVW5pdF0KRGVzY3JpcHRpb249UGVyaW9kaWMgJHZhciBjcmVkZW50aWFscyByZWZyZXNoCgpbVGltZXJdCk9uQm9vdFNlYz0wbWluCk9uQ2FsZW5kYXI9MC8xMjowMDowMApBY2N1cmFjeVNlYz01cwoKW0luc3RhbGxdCldhbnRlZEJ5PXRpbWVycy50YXJnZXQKRU9GCmRvbmUKCmNhdCA+L3Vzci9sb2NhbC9iaW4vZG93bmxvYWQtY3JlZGVudGlhbHMuc2ggPDxFT0YKIyEvYmluL2Jhc2gKc2V0IC1ldQoKQ09NUE9ORU5UPSJcJDEiCmVjaG8gIkRvd25sb2FkIFwkQ09NUE9ORU5UIGNyZWRlbnRpYWxzIgoKVEVNUF9ESVI9XCQobWt0ZW1wIC1kKQpleHBvcnQgQVpVUkVfQ09ORklHX0RJUj1cJChta3RlbXAgLWQpCmF6IGxvZ2luIC1pCmF6IGFjY291bnQgc2V0IC1zICIkU1VCU0NSSVBUSU9OSUQiCgp0cmFwICJjbGVhbnVwIiBFWElUCgpjbGVhbnVwKCkgewogIGF6IGxvZ291dAogIFtbICJcJFRFTVBfRElSIiA9fiAvdG1wLy4rIF1dICYmIHJtIC1yZiBcJFRFTVBfRElSCiAgW1sgIlwkQVpVUkVfQ09ORklHX0RJUiIgPX4gL3RtcC8uKyBdXSAmJiBybSAtcmYgXCRBWlVSRV9DT05GSUdfRElSCn0KCmlmIFsgIlwkQ09NUE9ORU5UIiA9ICJtZG0iIF07IHRoZW4KICBDVVJSRU5UX0NFUlRfRklMRT0iL2V0Yy9tZG0ucGVtIgplbGlmIFsgIlwkQ09NUE9ORU5UIiA9ICJtZHNkIiBdOyB0aGVuCiAgQ1VSUkVOVF9DRVJUX0ZJTEU9Ii92YXIvbGliL3dhYWdlbnQvTWljcm9zb2Z0LkF6dXJlLktleVZhdWx0LlN0b3JlL21kc2QucGVtIgplbHNlCiAgZWNobyBJbnZhbGlkIHVzYWdlICYmIGV4aXQgMQpmaQoKU0VDUkVUX05BTUU9InJwLVwke0NPTVBPTkVOVH0iCk5FV19DRVJUX0ZJTEU9IlwkVEVNUF9ESVIvXCRDT01QT05FTlQucGVtIgpmb3IgYXR0ZW1wdCBpbiB7MS4uNX07IGRvCiAgYXoga2V5dmF1bHQgc2VjcmV0IGRvd25sb2FkIC0tZmlsZSBcJE5FV19DRVJUX0ZJTEUgLS1pZCAiaHR0cHM6Ly8kS0VZVkFVTFRQUkVGSVgtc3ZjLnZhdWx0LmF6dXJlLm5ldC9zZWNyZXRzL1wkU0VDUkVUX05BTUUiICYmIGJyZWFrCiAgaWYgW1sgXCRhdHRlbXB0IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKaWYgWyAtZiBcJE5FV19DRVJUX0ZJTEUgXTsgdGhlbgogIGlmIFsgIlwkQ09NUE9ORU5UIiA9ICJtZHNkIiBdOyB0aGVuCiAgICBjaG93biBzeXNsb2c6c3lzbG9nIFwkTkVXX0NFUlRfRklMRQogIGVsc2UKICAgIHNlZCAtaSAtbmUgJzEsL0VORCBDRVJUSUZJQ0FURS8gcCcgXCRORVdfQ0VSVF9GSUxFCiAgZmkKICBjaG1vZCAwNjAwIFwkTkVXX0NFUlRfRklMRQogIG12IFwkTkVXX0NFUlRfRklMRSBcJENVUlJFTlRfQ0VSVF9GSUxFCmVsc2UKICBlY2hvIEZhaWxlZCB0byByZWZyZXNoIGNlcnRpZmljYXRlIGZvciBcJENPTVBPTkVOVCAmJiBleGl0IDEKZmkKRU9GCgpjaG1vZCB1K3ggL3Vzci9sb2NhbC9iaW4vZG93bmxvYWQtY3JlZGVudGlhbHMuc2gKCnN5c3RlbWN0bCBlbmFibGUgZG93bmxvYWQtbWRzZC1jcmVkZW50aWFscy50aW1lcgpzeXN0ZW1jdGwgZW5hYmxlIGRvd25sb2FkLW1kbS1jcmVkZW50aWFscy50aW1lcgoKL3Vzci9sb2NhbC9iaW4vZG93bmxvYWQtY3JlZGVudGlhbHMuc2ggbWRzZAovdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaCBtZG0KTURTRENFUlRJRklDQVRFU0FOPSQob3BlbnNzbCB4NTA5IC1pbiAvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZS9tZHNkLnBlbSAtbm9vdXQgLXN1YmplY3QgfCBzZWQgLWUgJ3MvLipDTj0vLycpCgpta2RpciAvZXRjL3N5c3RlbWQvc3lzdGVtL21kc2Quc2VydmljZS5kCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9tZHNkLnNlcnZpY2UuZC9vdmVycmlkZS5jb25mIDw8J0VPRicKW1VuaXRdCkFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9kZWZhdWx0L21kc2QgPDxFT0YKTURTRF9ST0xFX1BSRUZJWD0vdmFyL3J1bi9tZHNkL2RlZmF1bHQKTURTRF9PUFRJT05TPSItQSAtZCAtciBcJE1EU0RfUk9MRV9QUkVGSVgiCgpleHBvcnQgTU9OSVRPUklOR19HQ1NfRU5WSVJPTk1FTlQ9JyRNRFNERU5WSVJPTk1FTlQnCmV4cG9ydCBNT05JVE9SSU5HX0dDU19BQ0NPVU5UPUFST1JQTG9ncwpleHBvcnQgTU9OSVRPUklOR19HQ1NfUkVHSU9OPSckTE9DQVRJT04nCmV4cG9ydCBNT05JVE9SSU5HX0dDU19BVVRIX0lEX1RZUEU9QXV0aEtleVZhdWx0CmV4cG9ydCBNT05JVE9SSU5HX0dDU19BVVRIX0lEPSckTURTRENFUlRJRklDQVRFU0FOJwpleHBvcnQgTU9OSVRPUklOR19HQ1NfTkFNRVNQQUNFPUFST1JQTG9ncwpleHBvcnQgTU9OSVRPUklOR19DT05GSUdfVkVSU0lPTj0nJE1EU0RDT05GSUdWRVJTSU9OJwpleHBvcnQgTU9OSVRPUklOR19VU0VfR0VORVZBX0NPTkZJR19TRVJWSUNFPXRydWUKCmV4cG9ydCBNT05JVE9SSU5HX1RFTkFOVD0nJExPQ0FUSU9OJwpleHBvcnQgTU9OSVRPUklOR19ST0xFPXJwCmV4cG9ydCBNT05JVE9SSU5HX1JPTEVfSU5TVEFOQ0U9JyQoaG9zdG5hbWUpJwpFT0YKCiMgc2V0dGluZyBNT05JVE9SSU5HX0dDU19BVVRIX0lEX1RZUEU9QXV0aEtleVZhdWx0IHNlZW1zIHRvIGhhdmUgY2F1c2VkIG1kc2Qgbm90CiMgdG8gaG9ub3VyIFNTTF9DRVJUX0ZJTEUgYW55IG1vcmUsIGhlYXZlbiBvbmx5IGtub3dzIHdoeS4KbWtkaXIgLXAgL3Vzci9saWIvc3NsL2NlcnRzCmNzcGxpdCAtZiAvdXNyL2xpYi9zc2wvY2VydHMvY2VydC0gLWIgJTAzZC5wZW0gL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQgL14kLzEgeyp9ID4vZGV2L251bGwKY19yZWhhc2ggL3Vzci9saWIvc3NsL2NlcnRzCgpmb3Igc2VydmljZSBpbiBhcm8tbW9uaXRvciBhcm8tcG9ydGFsIGFyby1ycCBhdW9tcyBhenNlY2QgYXpzZWNtb25kIG1kc2QgbWRtIGNocm9ueWQgdGQtYWdlbnQtYml0OyBkbwogIHN5c3RlbWN0bCBlbmFibGUgJHNlcnZpY2Uuc2VydmljZQpkb25lCgpmb3Igc2NhbiBpbiBiYXNlbGluZSBjbGFtYXYgc29mdHdhcmU7IGRvCiAgL3Vzci9sb2NhbC9iaW4vYXpzZWNkIGNvbmZpZyAtcyAkc2NhbiAtZCBQMUQKZG9uZQoKKHNsZWVwIDMwOyByZWJvb3QpICYK')))]"
+                                        "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','CLUSTERPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('clusterParentDomainName')),''')\n','PORTALACCESSGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalAccessGroupIds')),''')\n','PORTALCLIENTID=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalClientId')),''')\n','PORTALELEVATEDGROUPIDS=$(base64 -d \u003c\u003c\u003c''',base64(parameters('portalElevatedGroupIds')),''')\n','RPIMAGE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpImage')),''')\n','RPMODE=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpMode')),''')\n','RPPARENTDOMAINNAME=$(base64 -d \u003c\u003c\u003c''',base64(parameters('rpParentDomainName')),''')\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_52''\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+b3BlbjogQkRCMDA5MSBEQl9WRVJTSU9OX01JU01BVENIOiBEYXRhYmFzZSBlbnZpcm9ubWVudCB2ZXJzaW9uIG1pc21hdGNoIgpybSAtZiAvdmFyL2xpYi9ycG0vX19kYioKCnJwbSAtLWltcG9ydCBodHRwczovL2RsLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsL1JQTS1HUEctS0VZLUVQRUwtNwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYwpycG0gLS1pbXBvcnQgaHR0cHM6Ly9wYWNrYWdlcy5mbHVlbnRiaXQuaW8vZmx1ZW50Yml0LmtleQoKZm9yIGF0dGVtcHQgaW4gezEuLjV9OyBkbwogIHl1bSAteSBpbnN0YWxsIGh0dHBzOi8vZGwuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvZXBlbC1yZWxlYXNlLWxhdGVzdC03Lm5vYXJjaC5ycG0gJiYgYnJlYWsKICBpZiBbWyAke2F0dGVtcHR9IC1sdCA1IF1dOyB0aGVuIHNsZWVwIDEwOyBlbHNlIGV4aXQgMTsgZmkKZG9uZQoKY2F0ID4vZXRjL3l1bS5yZXBvcy5kL2F6dXJlLnJlcG8gPDwnRU9GJwpbYXp1cmUtY2xpXQpuYW1lPWF6dXJlLWNsaQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZS1jbGkKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9eWVzCgpbYXp1cmVjb3JlXQpuYW1lPWF6dXJlY29yZQpiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS95dW1yZXBvcy9henVyZWNvcmUKZW5hYmxlZD15ZXMKZ3BnY2hlY2s9bm8KRU9GCgpjYXQgPi9ldGMveXVtLnJlcG9zLmQvdGQtYWdlbnQtYml0LnJlcG8gPDwnRU9GJwpbdGQtYWdlbnQtYml0XQpuYW1lPXRkLWFnZW50LWJpdApiYXNldXJsPWh0dHBzOi8vcGFja2FnZXMuZmx1ZW50Yml0LmlvL2NlbnRvcy83CmVuYWJsZWQ9eWVzCmdwZ2NoZWNrPXllcwpFT0YKCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KeXVtIC0tZW5hYmxlcmVwbz1yaHVpLXJoZWwtNy1zZXJ2ZXItcmh1aS1vcHRpb25hbC1ycG1zIC15IGluc3RhbGwgYXpzZWMtY2xhbWF2IGF6c2VjLW1vbml0b3IgYXp1cmUtY2xpLTIuMTAuMSBhenVyZS1tZHNkIGF6dXJlLXNlY3VyaXR5IGRvY2tlciBvcGVuc3NsLXBlcmwgdGQtYWdlbnQtYml0ICYmIGJyZWFrCiAgaWYgW1sgJHthdHRlbXB0fSAtbHQgNSBdXTsgdGhlbiBzbGVlcCAxMDsgZWxzZSBleGl0IDE7IGZpCmRvbmUKCnJwbSAtZSAkKHJwbSAtcWEgfCBncmVwIF5hYnJ0LSkKY2F0ID4vZXRjL3N5c2N0bC5kLzAxLWRpc2FibGUtY29yZS5jb25mIDw8J0VPRicKa2VybmVsLmNvcmVfcGF0dGVybiA9IHwvYmluL3RydWUKRU9GCnN5c2N0bCAtLXN5c3RlbQoKZmlyZXdhbGwtY21kIC0tYWRkLXBvcnQ9NDQzL3RjcCAtLXBlcm1hbmVudApmaXJld2FsbC1jbWQgLS1hZGQtcG9ydD00NDQvdGNwIC0tcGVybWFuZW50CmZpcmV3YWxsLWNtZCAtLWFkZC1wb3J0PTIyMjIvdGNwIC0tcGVybWFuZW50CgpjYXQgPi9ldGMvdGQtYWdlbnQtYml0L3RkLWFnZW50LWJpdC5jb25mIDw8J0VPRicKW0lOUFVUXQoJTmFtZSBzeXN0ZW1kCglUYWcgam91cm5hbGQKCVN5c3RlbWRfRmlsdGVyIF9DT01NPWFybwoKW0ZJTFRFUl0KCU5hbWUgbW9kaWZ5CglNYXRjaCBqb3VybmFsZAoJUmVtb3ZlX3dpbGRjYXJkIF8KCVJlbW92ZSBUSU1FU1RBTVAKCltGSUxURVJdCglOYW1lIHJld3JpdGVfdGFnCglNYXRjaCBqb3VybmFsZAoJUnVsZSAkTE9HS0lORCBpZnhhdWRpdCBpZnhhdWRpdCBmYWxzZQoKW09VVFBVVF0KCU5hbWUgZm9yd2FyZAoJUG9ydCAyOTIzMApFT0YKCmF6IGxvZ2luIC1pCmF6IGFjY291bnQgc2V0IC1zICIkU1VCU0NSSVBUSU9OSUQiCgpzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2UKYXogYWNyIGxvZ2luIC0tbmFtZSAiJChzZWQgLWUgJ3N8LiovfHwnIDw8PCIkQUNSUkVTT1VSQ0VJRCIpIgoKTURNSU1BR0U9IiR7UlBJTUFHRSUlLyp9LyR7TURNSU1BR0UjIyovfSIKZG9ja2VyIHB1bGwgIiRNRE1JTUFHRSIKZG9ja2VyIHB1bGwgIiRSUElNQUdFIgoKYXogbG9nb3V0Cgpta2RpciAvZXRjL2Fyby1ycApiYXNlNjQgLWQgPDw8IiRBRE1JTkFQSUNBQlVORExFIiA+L2V0Yy9hcm8tcnAvYWRtaW4tY2EtYnVuZGxlLnBlbQpjaG93biAtUiAxMDAwOjEwMDAgL2V0Yy9hcm8tcnAKCmNhdCA+L2V0Yy9zeXNjb25maWcvbWRtIDw8RU9GCk1ETUZST05URU5EVVJMPSckTURNRlJPTlRFTkRVUkwnCk1ETUlNQUdFPSckTURNSU1BR0UnCk1ETVNPVVJDRUVOVklST05NRU5UPSckTE9DQVRJT04nCk1ETVNPVVJDRVJPTEU9cnAKTURNU09VUkNFUk9MRUlOU1RBTkNFPSckKGhvc3RuYW1lKScKRU9GCgpta2RpciAvdmFyL2V0dwpjYXQgPi9ldGMvc3lzdGVtZC9zeXN0ZW0vbWRtLnNlcnZpY2UgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKUmVxdWlyZXM9ZG9ja2VyLnNlcnZpY2UKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvbWRtCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWVudHJ5cG9pbnQgL3Vzci9zYmluL01ldHJpY3NFeHRlbnNpb24gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLW0gMmcgXAogIC12IC9ldGMvbWRtLnBlbTovZXRjL21kbS5wZW0gXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRNRE1JTUFHRSBcCiAgLUNlcnRGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLUZyb250RW5kVXJsICRNRE1GUk9OVEVORFVSTCBcCiAgLUxvZ2dlciBDb25zb2xlIFwKICAtTG9nTGV2ZWwgV2FybmluZyBcCiAgLVByaXZhdGVLZXlGaWxlIC9ldGMvbWRtLnBlbSBcCiAgLVNvdXJjZUVudmlyb25tZW50ICRNRE1TT1VSQ0VFTlZJUk9OTUVOVCBcCiAgLVNvdXJjZVJvbGUgJE1ETVNPVVJDRVJPTEUgXAogIC1Tb3VyY2VSb2xlSW5zdGFuY2UgJE1ETVNPVVJDRVJPTEVJTlNUQU5DRQpFeGVjU3RvcD0vdXNyL2Jpbi9kb2NrZXIgc3RvcCAlTgpSZXN0YXJ0PWFsd2F5cwpSZXN0YXJ0U2VjPTEKU3RhcnRMaW1pdEludGVydmFsPTAKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKCmNhdCA+L2V0Yy9zeXNjb25maWcvYXJvLXJwIDw8RU9GCkFDUl9SRVNPVVJDRV9JRD0nJEFDUlJFU09VUkNFSUQnCkFETUlOX0FQSV9DTElFTlRfQ0VSVF9DT01NT05fTkFNRT0nJEFETUlOQVBJQ0xJRU5UQ0VSVENPTU1PTk5BTUUnCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCkRPTUFJTl9OQU1FPSckTE9DQVRJT04uJENMVVNURVJQQVJFTlRET01BSU5OQU1FJwpLRVlWQVVMVF9QUkVGSVg9JyRLRVlWQVVMVFBSRUZJWCcKTURNX0FDQ09VTlQ9QXp1cmVSZWRIYXRPcGVuU2hpZnRSUApNRE1fTkFNRVNQQUNFPVJQClJQX01PREU9JyRSUE1PREUnClJQSU1BR0U9JyRSUElNQUdFJwpFT0YKCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tcnAuc2VydmljZSA8PCdFT0YnCltVbml0XQpBZnRlcj1kb2NrZXIuc2VydmljZQpSZXF1aXJlcz1kb2NrZXIuc2VydmljZQoKW1NlcnZpY2VdCkVudmlyb25tZW50RmlsZT0vZXRjL3N5c2NvbmZpZy9hcm8tcnAKRXhlY1N0YXJ0UHJlPS0vdXNyL2Jpbi9kb2NrZXIgcm0gLWYgJU4KRXhlY1N0YXJ0PS91c3IvYmluL2RvY2tlciBydW4gXAogIC0taG9zdG5hbWUgJUggXAogIC0tbmFtZSAlTiBcCiAgLS1ybSBcCiAgLWUgQUNSX1JFU09VUkNFX0lEIFwKICAtZSBBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIERBVEFCQVNFX0FDQ09VTlRfTkFNRSBcCiAgLWUgRE9NQUlOX05BTUUgXAogIC1lIEtFWVZBVUxUX1BSRUZJWCBcCiAgLWUgTURNX0FDQ09VTlQgXAogIC1lIE1ETV9OQU1FU1BBQ0UgXAogIC1lIFJQX01PREUgXAogIC1tIDJnIFwKICAtcCA0NDM6ODQ0MyBcCiAgLXYgL2V0Yy9hcm8tcnA6L2V0Yy9hcm8tcnAgXAogIC12IC9ydW4vc3lzdGVtZC9qb3VybmFsOi9ydW4vc3lzdGVtZC9qb3VybmFsIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkUlBJTUFHRSBcCiAgcnAKRXhlY1N0b3A9L3Vzci9iaW4vZG9ja2VyIHN0b3AgLXQgMzYwMCAlTgpUaW1lb3V0U3RvcFNlYz0zNjAwClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CkVPRgoKY2F0ID4vZXRjL3N5c2NvbmZpZy9hcm8tbW9uaXRvciA8PEVPRgpDTFVTVEVSX01ETV9BQ0NPVU5UPUF6dXJlUmVkSGF0T3BlblNoaWZ0Q2x1c3RlcgpDTFVTVEVSX01ETV9OQU1FU1BBQ0U9QkJNCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCktFWVZBVUxUX1BSRUZJWD0nJEtFWVZBVUxUUFJFRklYJwpNRE1fQUNDT1VOVD1BenVyZVJlZEhhdE9wZW5TaGlmdFJQCk1ETV9OQU1FU1BBQ0U9QkJNClJQX01PREU9JyRSUE1PREUnClJQSU1BR0U9JyRSUElNQUdFJwpFT0YKCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tbW9uaXRvci5zZXJ2aWNlIDw8J0VPRicKW1VuaXRdCkFmdGVyPWRvY2tlci5zZXJ2aWNlClJlcXVpcmVzPWRvY2tlci5zZXJ2aWNlCgpbU2VydmljZV0KRW52aXJvbm1lbnRGaWxlPS9ldGMvc3lzY29uZmlnL2Fyby1tb25pdG9yCkV4ZWNTdGFydFByZT0tL3Vzci9iaW4vZG9ja2VyIHJtIC1mICVOCkV4ZWNTdGFydD0vdXNyL2Jpbi9kb2NrZXIgcnVuIFwKICAtLWhvc3RuYW1lICVIIFwKICAtLW5hbWUgJU4gXAogIC0tcm0gXAogIC1lIENMVVNURVJfTURNX0FDQ09VTlQgXAogIC1lIENMVVNURVJfTURNX05BTUVTUEFDRSBcCiAgLWUgREFUQUJBU0VfQUNDT1VOVF9OQU1FIFwKICAtZSBLRVlWQVVMVF9QUkVGSVggXAogIC1lIE1ETV9BQ0NPVU5UIFwKICAtZSBNRE1fTkFNRVNQQUNFIFwKICAtZSBSUF9NT0RFIFwKICAtbSAyZyBcCiAgLXYgL3J1bi9zeXN0ZW1kL2pvdXJuYWw6L3J1bi9zeXN0ZW1kL2pvdXJuYWwgXAogIC12IC92YXIvZXR3Oi92YXIvZXR3OnogXAogICRSUElNQUdFIFwKICBtb25pdG9yClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQpTdGFydExpbWl0SW50ZXJ2YWw9MAoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CkVPRgoKY2F0ID4vZXRjL3N5c2NvbmZpZy9hcm8tcG9ydGFsIDw8RU9GCkFaVVJFX1BPUlRBTF9BQ0NFU1NfR1JPVVBfSURTPSckUE9SVEFMQUNDRVNTR1JPVVBJRFMnCkFaVVJFX1BPUlRBTF9DTElFTlRfSUQ9JyRQT1JUQUxDTElFTlRJRCcKQVpVUkVfUE9SVEFMX0VMRVZBVEVEX0dST1VQX0lEUz0nJFBPUlRBTEVMRVZBVEVER1JPVVBJRFMnCkRBVEFCQVNFX0FDQ09VTlRfTkFNRT0nJERBVEFCQVNFQUNDT1VOVE5BTUUnCktFWVZBVUxUX1BSRUZJWD0nJEtFWVZBVUxUUFJFRklYJwpNRE1fQUNDT1VOVD1BenVyZVJlZEhhdE9wZW5TaGlmdFJQCk1ETV9OQU1FU1BBQ0U9UG9ydGFsClBPUlRBTF9IT1NUTkFNRT0nJExPQ0FUSU9OLmFkbWluLiRSUFBBUkVOVERPTUFJTk5BTUUnClJQX01PREU9JyRSUE1PREUnClJQSU1BR0U9JyRSUElNQUdFJwpFT0YKCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9hcm8tcG9ydGFsLnNlcnZpY2UgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKUmVxdWlyZXM9ZG9ja2VyLnNlcnZpY2UKU3RhcnRMaW1pdEludGVydmFsPTAKCltTZXJ2aWNlXQpFbnZpcm9ubWVudEZpbGU9L2V0Yy9zeXNjb25maWcvYXJvLXBvcnRhbApFeGVjU3RhcnRQcmU9LS91c3IvYmluL2RvY2tlciBybSAtZiAlTgpFeGVjU3RhcnQ9L3Vzci9iaW4vZG9ja2VyIHJ1biBcCiAgLS1ob3N0bmFtZSAlSCBcCiAgLS1uYW1lICVOIFwKICAtLXJtIFwKICAtZSBBRE1JTl9BUElfQ0xJRU5UX0NFUlRfQ09NTU9OX05BTUUgXAogIC1lIEFaVVJFX1BPUlRBTF9BQ0NFU1NfR1JPVVBfSURTIFwKICAtZSBBWlVSRV9QT1JUQUxfQ0xJRU5UX0lEIFwKICAtZSBBWlVSRV9QT1JUQUxfRUxFVkFURURfR1JPVVBfSURTIFwKICAtZSBEQVRBQkFTRV9BQ0NPVU5UX05BTUUgXAogIC1lIEtFWVZBVUxUX1BSRUZJWCBcCiAgLWUgTURNX0FDQ09VTlQgXAogIC1lIE1ETV9OQU1FU1BBQ0UgXAogIC1lIFBPUlRBTF9IT1NUTkFNRSBcCiAgLWUgUlBfTU9ERSBcCiAgLW0gMmcgXAogIC1wIDQ0NDo4NDQ0IFwKICAtcCAyMjIyOjIyMjIgXAogIC12IC9ydW4vc3lzdGVtZC9qb3VybmFsOi9ydW4vc3lzdGVtZC9qb3VybmFsIFwKICAtdiAvdmFyL2V0dzovdmFyL2V0dzp6IFwKICAkUlBJTUFHRSBcCiAgcG9ydGFsClJlc3RhcnQ9YWx3YXlzClJlc3RhcnRTZWM9MQoKW0luc3RhbGxdCldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0CkVPRgoKY2hjb24gLVIgc3lzdGVtX3U6b2JqZWN0X3I6dmFyX2xvZ190OnMwIC92YXIvb3B0L21pY3Jvc29mdC9saW51eG1vbmFnZW50Cgpta2RpciAtcCAvdmFyL2xpYi93YWFnZW50L01pY3Jvc29mdC5BenVyZS5LZXlWYXVsdC5TdG9yZQoKZm9yIHZhciBpbiAibWRzZCIgIm1kbSI7IGRvCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9kb3dubG9hZC0kdmFyLWNyZWRlbnRpYWxzLnNlcnZpY2UgPDxFT0YKW1VuaXRdCkRlc2NyaXB0aW9uPVBlcmlvZGljICR2YXIgY3JlZGVudGlhbHMgcmVmcmVzaAoKW1NlcnZpY2VdClR5cGU9b25lc2hvdApFeGVjU3RhcnQ9L3Vzci9sb2NhbC9iaW4vZG93bmxvYWQtY3JlZGVudGlhbHMuc2ggJHZhcgpFT0YKCmNhdCA+L2V0Yy9zeXN0ZW1kL3N5c3RlbS9kb3dubG9hZC0kdmFyLWNyZWRlbnRpYWxzLnRpbWVyIDw8RU9GCltVbml0XQpEZXNjcmlwdGlvbj1QZXJpb2RpYyAkdmFyIGNyZWRlbnRpYWxzIHJlZnJlc2gKCltUaW1lcl0KT25Cb290U2VjPTBtaW4KT25DYWxlbmRhcj0wLzEyOjAwOjAwCkFjY3VyYWN5U2VjPTVzCgpbSW5zdGFsbF0KV2FudGVkQnk9dGltZXJzLnRhcmdldApFT0YKZG9uZQoKY2F0ID4vdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaCA8PEVPRgojIS9iaW4vYmFzaApzZXQgLWV1CgpDT01QT05FTlQ9IlwkMSIKZWNobyAiRG93bmxvYWQgXCRDT01QT05FTlQgY3JlZGVudGlhbHMiCgpURU1QX0RJUj1cJChta3RlbXAgLWQpCmV4cG9ydCBBWlVSRV9DT05GSUdfRElSPVwkKG1rdGVtcCAtZCkKYXogbG9naW4gLWkKYXogYWNjb3VudCBzZXQgLXMgIiRTVUJTQ1JJUFRJT05JRCIKCnRyYXAgImNsZWFudXAiIEVYSVQKCmNsZWFudXAoKSB7CiAgYXogbG9nb3V0CiAgW1sgIlwkVEVNUF9ESVIiID1+IC90bXAvLisgXV0gJiYgcm0gLXJmIFwkVEVNUF9ESVIKICBbWyAiXCRBWlVSRV9DT05GSUdfRElSIiA9fiAvdG1wLy4rIF1dICYmIHJtIC1yZiBcJEFaVVJFX0NPTkZJR19ESVIKfQoKaWYgWyAiXCRDT01QT05FTlQiID0gIm1kbSIgXTsgdGhlbgogIENVUlJFTlRfQ0VSVF9GSUxFPSIvZXRjL21kbS5wZW0iCmVsaWYgWyAiXCRDT01QT05FTlQiID0gIm1kc2QiIF07IHRoZW4KICBDVVJSRU5UX0NFUlRfRklMRT0iL3Zhci9saWIvd2FhZ2VudC9NaWNyb3NvZnQuQXp1cmUuS2V5VmF1bHQuU3RvcmUvbWRzZC5wZW0iCmVsc2UKICBlY2hvIEludmFsaWQgdXNhZ2UgJiYgZXhpdCAxCmZpCgpTRUNSRVRfTkFNRT0icnAtXCR7Q09NUE9ORU5UfSIKTkVXX0NFUlRfRklMRT0iXCRURU1QX0RJUi9cJENPTVBPTkVOVC5wZW0iCmZvciBhdHRlbXB0IGluIHsxLi41fTsgZG8KICBheiBrZXl2YXVsdCBzZWNyZXQgZG93bmxvYWQgLS1maWxlIFwkTkVXX0NFUlRfRklMRSAtLWlkICJodHRwczovLyRLRVlWQVVMVFBSRUZJWC1zdmMudmF1bHQuYXp1cmUubmV0L3NlY3JldHMvXCRTRUNSRVRfTkFNRSIgJiYgYnJlYWsKICBpZiBbWyBcJGF0dGVtcHQgLWx0IDUgXV07IHRoZW4gc2xlZXAgMTA7IGVsc2UgZXhpdCAxOyBmaQpkb25lCgppZiBbIC1mIFwkTkVXX0NFUlRfRklMRSBdOyB0aGVuCiAgaWYgWyAiXCRDT01QT05FTlQiID0gIm1kc2QiIF07IHRoZW4KICAgIGNob3duIHN5c2xvZzpzeXNsb2cgXCRORVdfQ0VSVF9GSUxFCiAgZWxzZQogICAgc2VkIC1pIC1uZSAnMSwvRU5EIENFUlRJRklDQVRFLyBwJyBcJE5FV19DRVJUX0ZJTEUKICBmaQogIGNobW9kIDA2MDAgXCRORVdfQ0VSVF9GSUxFCiAgbXYgXCRORVdfQ0VSVF9GSUxFIFwkQ1VSUkVOVF9DRVJUX0ZJTEUKZWxzZQogIGVjaG8gRmFpbGVkIHRvIHJlZnJlc2ggY2VydGlmaWNhdGUgZm9yIFwkQ09NUE9ORU5UICYmIGV4aXQgMQpmaQpFT0YKCmNobW9kIHUreCAvdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaAoKc3lzdGVtY3RsIGVuYWJsZSBkb3dubG9hZC1tZHNkLWNyZWRlbnRpYWxzLnRpbWVyCnN5c3RlbWN0bCBlbmFibGUgZG93bmxvYWQtbWRtLWNyZWRlbnRpYWxzLnRpbWVyCgovdXNyL2xvY2FsL2Jpbi9kb3dubG9hZC1jcmVkZW50aWFscy5zaCBtZHNkCi91c3IvbG9jYWwvYmluL2Rvd25sb2FkLWNyZWRlbnRpYWxzLnNoIG1kbQpNRFNEQ0VSVElGSUNBVEVTQU49JChvcGVuc3NsIHg1MDkgLWluIC92YXIvbGliL3dhYWdlbnQvTWljcm9zb2Z0LkF6dXJlLktleVZhdWx0LlN0b3JlL21kc2QucGVtIC1ub291dCAtc3ViamVjdCB8IHNlZCAtZSAncy8uKkNOPS8vJykKCm1rZGlyIC9ldGMvc3lzdGVtZC9zeXN0ZW0vbWRzZC5zZXJ2aWNlLmQKY2F0ID4vZXRjL3N5c3RlbWQvc3lzdGVtL21kc2Quc2VydmljZS5kL292ZXJyaWRlLmNvbmYgPDwnRU9GJwpbVW5pdF0KQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CkVPRgoKY2F0ID4vZXRjL2RlZmF1bHQvbWRzZCA8PEVPRgpNRFNEX1JPTEVfUFJFRklYPS92YXIvcnVuL21kc2QvZGVmYXVsdApNRFNEX09QVElPTlM9Ii1BIC1kIC1yIFwkTURTRF9ST0xFX1BSRUZJWCIKCmV4cG9ydCBNT05JVE9SSU5HX0dDU19FTlZJUk9OTUVOVD0nJE1EU0RFTlZJUk9OTUVOVCcKZXhwb3J0IE1PTklUT1JJTkdfR0NTX0FDQ09VTlQ9QVJPUlBMb2dzCmV4cG9ydCBNT05JVE9SSU5HX0dDU19SRUdJT049JyRMT0NBVElPTicKZXhwb3J0IE1PTklUT1JJTkdfR0NTX0FVVEhfSURfVFlQRT1BdXRoS2V5VmF1bHQKZXhwb3J0IE1PTklUT1JJTkdfR0NTX0FVVEhfSUQ9JyRNRFNEQ0VSVElGSUNBVEVTQU4nCmV4cG9ydCBNT05JVE9SSU5HX0dDU19OQU1FU1BBQ0U9QVJPUlBMb2dzCmV4cG9ydCBNT05JVE9SSU5HX0NPTkZJR19WRVJTSU9OPSckTURTRENPTkZJR1ZFUlNJT04nCmV4cG9ydCBNT05JVE9SSU5HX1VTRV9HRU5FVkFfQ09ORklHX1NFUlZJQ0U9dHJ1ZQoKZXhwb3J0IE1PTklUT1JJTkdfVEVOQU5UPSckTE9DQVRJT04nCmV4cG9ydCBNT05JVE9SSU5HX1JPTEU9cnAKZXhwb3J0IE1PTklUT1JJTkdfUk9MRV9JTlNUQU5DRT0nJChob3N0bmFtZSknCkVPRgoKIyBzZXR0aW5nIE1PTklUT1JJTkdfR0NTX0FVVEhfSURfVFlQRT1BdXRoS2V5VmF1bHQgc2VlbXMgdG8gaGF2ZSBjYXVzZWQgbWRzZCBub3QKIyB0byBob25vdXIgU1NMX0NFUlRfRklMRSBhbnkgbW9yZSwgaGVhdmVuIG9ubHkga25vd3Mgd2h5Lgpta2RpciAtcCAvdXNyL2xpYi9zc2wvY2VydHMKY3NwbGl0IC1mIC91c3IvbGliL3NzbC9jZXJ0cy9jZXJ0LSAtYiAlMDNkLnBlbSAvZXRjL3BraS90bHMvY2VydHMvY2EtYnVuZGxlLmNydCAvXiQvMSB7Kn0gPi9kZXYvbnVsbApjX3JlaGFzaCAvdXNyL2xpYi9zc2wvY2VydHMKCmZvciBzZXJ2aWNlIGluIGFyby1tb25pdG9yIGFyby1wb3J0YWwgYXJvLXJwIGF1b21zIGF6c2VjZCBhenNlY21vbmQgbWRzZCBtZG0gY2hyb255ZCB0ZC1hZ2VudC1iaXQ7IGRvCiAgc3lzdGVtY3RsIGVuYWJsZSAkc2VydmljZS5zZXJ2aWNlCmRvbmUKCmZvciBzY2FuIGluIGJhc2VsaW5lIGNsYW1hdiBzb2Z0d2FyZTsgZG8KICAvdXNyL2xvY2FsL2Jpbi9henNlY2QgY29uZmlnIC1zICRzY2FuIC1kIFAxRApkb25lCgooc2xlZXAgMzA7IHJlYm9vdCkgJgo=')))]"
                                     }
                                 }
                             }
diff --git a/docs/prepare-a-shared-rp-development-environment.md b/docs/prepare-a-shared-rp-development-environment.md
index a4347e38b..7caa9d33f 100644
--- a/docs/prepare-a-shared-rp-development-environment.md
+++ b/docs/prepare-a-shared-rp-development-environment.md
@@ -360,6 +360,8 @@ each of the bash functions below.
 
    If you need them in development:
 
+   ! DO NOT RUN THIS IN E2E, INT! !
+
    ```bash
    az keyvault certificate import \
         --vault-name "$KEYVAULT_PREFIX-svc" \
@@ -371,6 +373,19 @@ each of the bash functions below.
         --file secrets/rp-logging-int.pem
    ```
 
+1. In pre-production (int, e2e) certain certificates are provisioned via keyvault
+integration. These should be rotated and generated in the keyvault itself:
+
+```
+Vault Name: "$KEYVAULT_PREFIX-svc"
+Certificate: rp-firstparty
+Development value: secrets/firstparty.pem
+
+Vault Name: "$KEYVAULT_PREFIX-svc"
+Certificate: cluster-mdsd
+Development value: secrets/cluster-logging-int.pem
+```
+
 1. Create nameserver records in the parent DNS zone:
 
    ```bash
diff --git a/hack/cluster/cluster.go b/hack/cluster/cluster.go
index 139b1cc28..a6190b853 100644
--- a/hack/cluster/cluster.go
+++ b/hack/cluster/cluster.go
@@ -36,7 +36,10 @@ func run(ctx context.Context, log *logrus.Entry) error {
 		return err
 	}
 
-	vnetResourceGroup := os.Getenv("CLUSTER")
+	vnetResourceGroup := os.Getenv("RESOURCEGROUP") // TODO: remove this when we deploy and peer a vnet per cluster create
+	if os.Getenv("CI") != "" {
+		vnetResourceGroup = os.Getenv("CLUSTER")
+	}
 	clusterName := os.Getenv("CLUSTER")
 
 	c, err := cluster.New(log, env, os.Getenv("CI") != "")
diff --git a/hack/devtools/deploy-shared-env.sh b/hack/devtools/deploy-shared-env.sh
index 565424252..19205f500 100644
--- a/hack/devtools/deploy-shared-env.sh
+++ b/hack/devtools/deploy-shared-env.sh
@@ -90,10 +90,6 @@ deploy_env_dev_override() {
 
 import_certs_secrets() {
     echo "########## Import certificates to $KEYVAULT_PREFIX-svc KV ##########"
-    az keyvault certificate import \
-        --vault-name "$KEYVAULT_PREFIX-svc" \
-        --name rp-firstparty \
-        --file secrets/firstparty.pem >/dev/null
     az keyvault certificate import \
         --vault-name "$KEYVAULT_PREFIX-svc" \
         --name rp-server \
@@ -106,10 +102,6 @@ import_certs_secrets() {
         --vault-name "$KEYVAULT_PREFIX-por" \
         --name portal-client \
         --file secrets/portal-client.pem >/dev/null
-    az keyvault certificate import \
-        --vault-name "$KEYVAULT_PREFIX-svc" \
-        --name cluster-mdsd \
-        --file secrets/cluster-logging-int.pem >/dev/null
     az keyvault secret list \
         --vault-name "$KEYVAULT_PREFIX-svc" \
         --query '[].name' \
diff --git a/pkg/cluster/install.go b/pkg/cluster/install.go
index 9a6a77792..613dfb77a 100644
--- a/pkg/cluster/install.go
+++ b/pkg/cluster/install.go
@@ -19,6 +19,7 @@ import (
 
 	"github.com/Azure/ARO-RP/pkg/api"
 	aroclient "github.com/Azure/ARO-RP/pkg/operator/clientset/versioned"
+	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	"github.com/Azure/ARO-RP/pkg/util/restconfig"
 	"github.com/Azure/ARO-RP/pkg/util/steps"
 	"github.com/Azure/ARO-RP/pkg/util/version"
@@ -125,7 +126,7 @@ func (m *manager) Install(ctx context.Context) error {
 
 func (m *manager) runSteps(ctx context.Context, s []steps.Step) error {
 	err := steps.Run(ctx, m.log, 10*time.Second, s)
-	if err != nil {
+	if err != nil && m.env.DeploymentMode() != deployment.Development {
 		m.gatherFailureLogs(ctx)
 	}
 	return err
diff --git a/pkg/deploy/bindata.go b/pkg/deploy/bindata.go
index 77fc330b8..b68be8f8d 100644
--- a/pkg/deploy/bindata.go
+++ b/pkg/deploy/bindata.go
@@ -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\xbd\x6b\x73\xe2\x48\xb2\x3f\xfc\x7e\x3f\x85\xc3\xcf\x89\xf0\xcc\x73\xda\xb6\x24\xa0\x6d\x6d\xc4\x79\x81\x04\x12\x12\x20\xd0\xad\x24\xb4\x67\x63\x43\x37\x84\xac\xd2\x65\x90\x00\x8b\x13\xfb\xdd\xff\x51\xba\x70\x33\x18\xec\x76\xf7\x74\xef\x98\x89\xe8\xc1\xa8\x2a\x2b\x95\x95\xf9\xcb\xac\xaa\xac\xaa\xff\xfb\xdb\xd5\xd5\xd5\xd5\xf5\x7f\xa5\xf6\xcc\x0d\xcd\xeb\xbf\x5f\x5d\xcf\xb2\x2c\x49\xff\x7e\x7f\x5f\xfe\x72\x17\x9a\x91\xe9\xb9\xa1\x1b\x65\x77\xe6\x7a\x31\x77\xef\xec\x38\xac\x9e\xa5\xf7\x04\x86\xb7\x6e\x31\xfc\x16\xc3\xef\x1d\x37\x81\x71\x8e\xca\x29\x6e\x98\x40\x33\x73\xef\x9e\xd2\x38\xfa\xff\xae\xbf\x94\x2d\xd8\x71\x94\xb9\x51\x06\xdc\x79\xea\xc7\x11\x6a\x08\xbf\xc3\xd0\x7f\x75\x81\xc4\x9c\x9b\xa1\x9b\xb9\xf3\xf4\xfa\xef\x57\x25\x5b\xc5\xef\xa6\x3d\x97\xdc\x34\x5e\xcc\x6d\x97\x73\xf6\x1e\x15\x8f\xb3\x3c\x71\x11\xb5\x34\x9b\xfb\x91\x77\xbd\x79\xf8\xef\x2f\x3b\x24\x9c\xd0\x8f\xda\x89\x4f\x9b\xd4\x22\x72\xa0\xfb\x8d\x54\xa0\xef\x46\x19\xed\xce\x33\x3a\x0e\xc3\x38\x12\xcc\xf0\x9d\x14\x6d\xb8\x48\x33\x77\x3e\x36\xe7\x6e\x94\x75\xe2\xd0\xf4\xbf\x81\x98\x63\x66\xa6\x65\xa6\x6e\xdb\xb6\xe3\x45\x94\xbd\x9f\x90\x1b\xd9\xf3\x3c\xc9\xfc\x38\x6a\x67\xbd\x38\xcd\x4e\x53\xb1\xe2\x18\x9e\xa0\xf1\x9c\xcd\x4d\x3a\x4e\xc3\x38\xed\x50\xdc\x38\x3d\xcb\xc9\x97\xfd\xa7\x8e\x3b\x35\x17\x30\x03\x26\x5c\x14\xa5\x8e\xb7\x32\x4d\x64\x77\xbe\xf4\x6d\x77\x3c\xf7\x23\xdb\x4f\x4c\xf8\x5e\x0d\x99\x2e\x20\xec\x14\x1a\x7c\xe6\x6d\x5f\xe7\x73\x6a\xc2\xd4\x3d\xda\x40\xe0\xe6\x4b\x54\x72\x3c\x77\xa7\xfe\xf3\xfb\x98\x0c\x9d\x90\x99\x17\x66\xe4\xa8\x73\xf8\x5e\x1a\xa9\x43\xc7\xd1\xd4\xf7\xb6\x96\xf8\x4e\x32\xdd\x68\xe9\xcf\xe3\x08\x99\xfc\xfb\x88\x24\xf1\x3c\x33\x61\xdb\xb6\xdd\x34\x65\xe7\xf1\x22\xe1\x9c\xf3\x8a\xf2\x0a\xa5\xd2\x30\xdf\xab\x02\x25\x8d\x2e\x74\x97\x66\xe6\x3a\xdf\xc6\xcf\x3c\xe1\x42\xd3\x7b\xa7\xfd\xcd\x93\x61\xec\x9c\xaf\xfb\x2e\x8b\x99\x27\x1f\x03\x36\xf3\x0f\xb3\xbc\x34\x9d\x8d\x17\x16\xf4\xed\xbe\xfb\x8a\xed\xbd\x4a\x21\x8b\xe7\xa6\x57\xe3\x5e\xf9\x66\xef\xa4\xb4\xb0\x52\x7b\xee\x17\xd8\x57\xfb\x9c\x42\x11\xde\x2f\xa8\x65\x28\xfb\xeb\x6f\xee\x4c\x39\x33\x23\xc7\x9c\x3b\xff\xea\x10\xe9\xbf\x96\x8d\x53\x4d\xa5\xe9\x1b\x19\xfd\xdb\x0e\x8d\xeb\x79\xf5\xc6\x48\xe7\xff\xb1\x29\x73\x40\x2a\x0d\x16\x2f\xe8\x17\x0f\xa2\xb2\xe5\x0d\xab\xd7\x7b\x45\xfe\x7d\xf0\x82\xc9\x3c\x4e\xdc\x79\xe6\xbb\x2f\x0d\xac\x7c\x5e\xa8\x04\x37\x6e\x43\x18\xdb\x26\xea\x8f\xa1\x9b\xcd\x62\xa7\x6a\x21\xf3\xed\xd7\xe9\xd7\xdc\xcc\x93\xdb\xc4\x4f\x0e\xc5\x5b\xcb\x63\xe8\xdb\xf3\x38\x8d\xa7\xd9\x9d\xe0\x66\xab\x78\x1e\xdc\x6f\xda\x75\x9c\xb9\x9b\xa6\x6e\x7a\x58\xb5\x66\x07\x55\xff\xc7\x7c\x57\x47\x7e\xfb\xfd\xae\x7e\xf8\xcf\xc3\x5a\x76\x1c\x39\xfe\xa6\xda\x36\xd2\xf9\xed\x66\xeb\x78\x6e\x7e\x7f\x51\xcd\x4c\xfc\x9d\x78\x89\xc0\x70\xf2\x16\x7b\xb8\xc5\xf0\xa3\xfd\xff\x6b\x77\x54\x89\xbe\x9f\x9d\xf5\x5d\x3b\x6b\x5a\x45\x0f\xdc\xb8\x0c\x01\x16\xf3\x42\x02\xfb\x06\xbf\xfb\x79\x49\xe3\xd2\xb6\xf6\xcb\xee\x77\xd4\xd9\x0a\x45\x25\xdf\xd9\xeb\x36\xce\xf9\xed\xe6\x02\x15\xb8\xf9\x72\x75\x53\x1a\xfd\xcb\x2e\x3a\xda\x4c\x66\x7a\x88\xa1\x68\x01\xe1\xab\x85\xff\x7d\xf2\xe9\xbf\x4f\xb7\xb2\x8b\x43\xb5\xf0\xaf\x8f\x96\x3e\x41\xe4\xd7\xec\x80\xad\x31\xff\x54\x9d\x50\xb1\x75\xa6\x23\x5e\xfc\xfa\xcf\x97\xa4\xaf\x2d\xd3\x0e\xdc\xc8\xa9\xde\x7a\x1c\xc7\xf0\x5d\x46\xb4\xa3\x1e\x15\xc5\x6f\x61\x0a\xc6\xa6\x43\x99\xd0\x8c\x6c\x3f\xf2\xa4\x05\x74\xbf\xbb\x61\x9f\x00\x94\x0f\xd4\xaf\xed\x3b\xb9\xf3\xf4\xfe\x14\x80\x55\x56\x0f\xad\xea\x4b\x5d\x0e\xa9\xdf\xeb\x0a\xf5\xba\x72\x1e\xe9\xe7\xef\xf6\x6e\x47\x54\xea\xf0\xb5\xaa\x22\xdf\xfc\x56\xc9\x3c\xb6\x5e\x86\x89\x1f\xf5\x22\x05\xf5\x17\xbc\x17\xbf\x7e\x04\xe7\x59\x6c\x17\xbd\x70\xad\xd8\x87\xb1\xc2\x8b\xe2\x88\xb1\x8e\x8f\xc2\x5e\x6b\x51\x7b\xf4\x4e\x19\x5b\x9f\xab\x5a\xab\xd0\x38\x9e\xa3\xe1\x6d\xb3\xd9\xb8\x4c\x55\xb6\xe5\xbf\xd5\x61\x40\x6b\xbe\x80\xee\x9f\xe1\x2e\x7e\x4a\xb3\x3e\x40\xef\x4f\xd3\x3e\xca\xdd\x0f\x37\xed\xda\xd7\xa3\x27\xb7\xc5\xdc\xf1\x5f\xc9\xc8\x9b\x1f\x11\x90\x7c\x1a\xfa\xa7\xa1\xbf\xf9\xad\xfe\x5c\x43\x4f\xd3\xd9\xaf\x6b\xe6\x04\xf1\x26\x2b\x27\x08\x82\xf8\x38\x33\x47\xa2\xfb\x96\x20\xbf\xec\x99\xef\x3e\x62\xdf\xe9\x9b\x1e\x02\xf5\x73\x22\x4e\x2e\x45\xd0\x68\x11\x5a\xee\x7c\x34\x1d\xd7\xef\x71\xae\x33\xe6\xee\x1f\x0b\x37\xcd\xc6\x66\x36\x43\xdc\xdc\xcf\x5c\x13\x66\xb3\xf5\xfd\xdc\x35\x9d\xfc\xb4\x06\x5e\x18\x64\x95\x66\xf4\x67\x0c\xc9\xdf\x2d\xe1\xe6\x2f\x24\xe1\x97\xd1\xc1\x9f\x2d\xeb\x0b\x90\x26\xd9\xda\xfd\x9b\x45\xfd\x71\xd2\x7a\x0b\x4e\x5c\x34\xc5\x5a\x20\xf9\xe5\xb3\xab\x7b\x0e\xe1\xe7\x9c\x59\x7d\xb1\x6a\x92\xb8\x91\x93\x8e\xa2\xa3\xe8\xf8\x5d\x66\xb2\xbe\x71\x7e\xf2\x6f\xc7\x7b\xf1\x1b\x26\x8a\xf7\xa4\x5a\x2e\x3e\x9d\xe0\x3c\xf3\xdd\xf9\xde\xd4\xf2\x91\x32\xb6\x99\x98\xb6\x9f\xe5\xd7\x7f\xbf\x6a\x7c\xd3\xcc\xf3\x22\xf1\xe6\xa6\xe3\x8e\x63\xe8\xdb\x2f\x97\xf9\x36\xc5\xc2\x72\xe1\xf3\x7a\x68\x46\x0b\x13\xbe\x54\xff\x23\x46\x74\xbd\xf4\xe7\xd9\xc2\x84\x43\xd3\x9e\xf9\x91\x3b\x9e\xc7\x53\xff\x48\x86\xc7\xa6\x78\x9c\x9e\x2b\x52\xbe\x79\x1c\x26\x8b\xcc\x9d\x0b\x66\xe8\x6e\xd6\xec\xaf\xff\x61\xc7\x91\x6d\x66\xbf\xa1\x2e\xbc\xf9\x72\xb5\x2f\xeb\x72\xf5\xed\xe6\xf7\x2f\x57\x37\xb7\xaf\xcf\x7b\x96\xa9\x24\x6a\xea\xce\xeb\x6e\xb3\x61\xbc\x70\x6e\x17\xa9\x3b\x7f\xad\x1a\xf4\xa3\xc5\xf3\xdb\x22\xf5\x6b\xc7\x4f\x4d\x0b\xba\x63\x33\x4d\x57\xf1\xdc\x69\x2f\xb2\x99\x1b\x65\xfe\xc6\x7c\xb3\xf9\xc2\x3d\x83\x72\x08\x89\x2e\x0a\x34\x93\x7a\x21\xf7\x74\x7c\x72\xf8\x39\x4f\x75\x4b\x7d\xe3\x9f\xe2\xd0\xbd\xdf\x4a\xec\xfe\x2e\x4d\x67\xf7\xe6\x22\x9b\xc5\x73\x7f\xed\x3a\xff\x0a\x10\x03\xe7\x67\x9d\x37\x84\x03\x37\xef\x98\x99\xf9\xc2\x7c\x76\x97\xa6\xcf\x46\xbb\xf5\xe7\xf4\x14\x75\xfd\xf9\xe7\x7b\xa7\xb8\xdf\xe2\x39\xeb\x55\xf1\x8b\x94\xdd\x0f\x4d\xcf\x95\xdc\xa9\x3b\x77\x23\xfb\xfc\xa0\xa2\xec\xe7\x74\x56\xe2\x87\xe4\x3a\x3d\xf3\x6c\x08\x1e\x4f\xa7\x55\xf1\x5e\x77\x70\xae\x70\x89\x72\xd7\x0f\xb7\x03\x30\x3c\x57\x76\xb9\xf5\x0c\x0f\x77\xe4\x1d\x81\x11\x18\x8e\x61\x38\xfe\xf5\x7d\x81\x4b\x9c\x76\xfc\x34\x38\x2f\x02\x7b\xee\x9a\x99\x3b\x4a\x6a\x6f\xc6\xcc\xe3\xb0\xcc\xf9\x38\xc3\x6f\x99\x4f\xe7\x5c\xd4\xca\xd5\xd5\x8b\xf4\x06\xa5\xf2\xd7\xe3\xb9\x1b\xfa\x8b\xf0\x5f\x03\x49\x3e\x33\x0a\xfb\x20\x7d\x8a\x4a\x8f\x76\x91\x3e\x95\x01\xe4\xf8\xa2\x11\xea\x8f\x9c\x61\x7e\x35\x06\x2b\x5b\xe2\xa2\xcc\x9d\x4f\x4d\xdb\xbd\x70\x85\xb4\xfe\x5c\xd0\x91\x3b\x71\x18\x72\x16\xb7\x91\x6f\x5f\xb2\x36\xf6\x86\x40\x77\xa7\x8e\x1f\x9a\xf3\xfc\x22\x78\xdf\x54\xf2\x93\x37\xbe\xf3\xee\xe7\x72\x1c\xbf\x3a\x26\x0b\x3f\xb1\x8b\xb6\xdf\x00\xdb\x57\xef\x14\xce\x5e\xfd\x74\x61\x45\xee\xcb\xf4\xb5\x8b\xeb\x5f\xa4\xbc\x55\x84\x52\xfd\x99\xde\x97\x8d\xd6\xfa\xbb\x8c\xdc\xac\xfa\x5a\x3e\xb8\xd8\xd5\xec\x7e\xce\x4c\xb6\x1c\x65\xfe\x3d\x5a\xb2\x4f\x60\x3f\xba\x7d\xfb\x1c\xe2\x51\xaa\x87\xba\x91\xf8\xc9\x8f\x91\xc7\x2e\xc8\x50\x6f\x58\xe0\x3d\xf7\x79\x9f\x1c\xae\xfe\xfc\x39\xc8\x53\x9f\xf3\x31\xce\xe1\xe7\xf5\x98\xe7\xfd\xf4\x2f\x2b\x79\xbe\xf5\xd7\xe9\x9c\x7e\x7a\x9c\xf2\xc9\x98\xcc\xb5\x17\x73\x3f\xcb\x2f\x72\xa2\x47\xd2\xb0\xf7\xc3\xd3\xc3\x02\x27\xbb\xf3\x14\x3b\x8e\x6f\x7a\x51\x9c\x66\xbe\x7d\xd9\x98\xc8\x8a\xe3\xac\xb3\xad\x73\xde\xb5\xbb\x11\x1a\x7a\x38\x17\x8e\x32\xca\x38\x47\x9d\xfb\x7b\x23\xad\x7a\x3b\xc2\xc1\x70\xeb\x58\xd2\x67\x31\xf4\xba\x7f\x3d\x02\x78\x93\x80\xdc\xe7\xcc\x8d\x50\x74\x79\x59\x87\xd5\xa5\xbf\x4b\xb4\x60\xa7\xe7\x42\xcb\xab\x77\x47\x0b\xbb\xe1\xfc\x16\x5e\xda\xc5\x76\x8f\xee\xf6\xad\x2e\x8c\x23\xea\x29\x25\x7a\x91\x66\x71\x28\x17\x09\xb5\x6f\xa9\xdb\x33\x23\x07\xba\xf3\xdd\x29\x9f\xcd\x2e\x91\xb3\x04\xcc\x45\x16\xab\xe5\x64\xc3\xd0\x8f\xe2\x1d\x2a\x6f\x88\x84\x52\x37\xcb\xfc\xa8\x48\x49\xfa\xbf\x0b\x1d\x49\x31\xc7\xe8\xda\x99\xeb\xc8\x3b\x95\x2f\x1f\x83\x96\x79\xc7\x85\xe6\x5b\x66\xea\x7e\x6d\xfe\x56\x19\x40\xf9\x97\x12\xcb\x45\xee\xee\x6f\x37\x36\x01\x30\x8e\xc6\xa1\xdb\x8e\xfb\x37\xbf\x7f\xb9\x19\x76\x86\x8c\x34\x12\x94\xae\xd0\x51\xa5\xc1\xff\xfc\x57\x55\xe1\xea\xd6\xb9\xfa\xdf\x05\x86\x35\xec\xdd\x7f\x6f\x6e\x6e\xbe\x54\xe4\x77\x8d\x69\x7f\x63\xc1\xcd\xef\xbf\x7f\xb9\xb9\xb9\xf9\xfd\x7f\xa3\x1b\x44\x5e\xee\xd0\x23\x81\xe1\x58\xd0\x95\x64\x6e\x24\xbc\xb7\x85\x83\x6d\x07\x2f\x1a\xe9\x0a\x80\x93\x46\xc2\xb0\x2b\x28\xef\x6f\x62\x67\x4b\xc2\x5e\x03\x6d\x5a\x92\xba\xf2\x48\x95\xe8\x2e\xd7\x79\x1f\xf9\xbd\x6d\x48\x7b\xc4\xe9\x81\x2a\x2b\x5d\x69\xdc\x96\xba\x82\xd2\x19\x0d\xdb\x9c\x20\xb4\x87\xdd\xf7\x35\x73\x62\x4b\xd0\x5e\x83\xe3\x91\xa4\xb4\x07\x6d\x9a\xee\xca\x32\x2b\x8d\xd4\x31\xd7\x91\xdf\xd7\xda\xb1\x1d\x18\x47\x9a\xa2\x07\x5c\x57\x50\xde\x2b\xb9\xfd\xcd\x19\x47\xc8\x77\x07\x5d\xd0\x56\xba\x9d\x8f\x78\x97\xc3\xfd\x1b\x7b\xcd\x49\x63\x6e\xd8\x66\xdf\xd9\x33\xd5\x9e\x8e\x03\x82\xc3\x51\xe7\xdd\xf4\x86\xb1\x73\x48\xee\x63\x94\xe8\xe5\x2e\x8f\x7d\x6b\xe8\x0c\x39\xa1\x3d\xe6\xca\x6e\xa5\xbb\x92\x42\x8f\x86\xc3\xd1\x37\x34\xf8\xda\xd6\xb8\xbd\xa6\x3b\x6d\xa5\x4d\xb5\xe5\x6e\x9b\xa6\x47\xaa\xa0\xbc\xbf\xc5\x23\xbb\xdd\xf6\x1a\xea\x77\x27\xa0\xad\x0e\x94\xb1\xd4\x65\x38\xfd\x7d\x6d\xec\xef\xd9\x3a\x2e\xc2\x36\xa5\x0a\x9d\x41\xf7\x7f\x10\x89\xa3\x12\xa9\xb6\x1c\xde\x14\x95\x2b\xb4\x1b\x96\x6a\x78\x73\x73\xef\xb9\x91\xbb\x34\x43\x27\xfc\x7b\x68\x22\xbb\xff\x57\x8b\xa8\x4a\x0d\x46\x74\x5b\x79\x13\xde\x9e\x5a\x86\xd9\x61\x5b\x56\x29\x99\x96\xb8\x31\x22\xfc\x16\x73\xde\xdd\x18\xf3\xdb\xef\x77\xbb\x7f\x72\xce\xae\x02\x57\x20\x5b\x58\xf2\xdb\x3a\xf7\x90\x7b\x14\xff\xec\x50\x46\xff\x1c\xba\x42\x3a\x82\xb8\x25\xb7\x33\x57\xa6\x70\x9b\x95\x66\x0e\xab\x7a\x03\xdd\xf3\x00\xc6\x0c\x4d\xad\x85\xbb\x5d\x26\x32\xb4\x16\x46\x7b\x49\xea\x84\xa0\xe9\xb0\x60\x61\xd0\xed\xcc\xa2\xdb\x73\x41\x69\x43\x09\xf2\x8c\x24\xb7\x97\x06\x0b\x88\x41\x83\x5f\x5a\x0d\x89\x30\x72\x32\xb7\x08\x12\xb3\x7a\x93\xbe\xcb\x1a\x6b\x9d\x70\x72\xab\xe1\x84\x76\xde\x5e\x1e\xa3\x33\x54\xda\x2b\x5e\x35\x64\x49\x55\xbd\x01\x21\x41\xc7\x2f\xeb\x3b\xa1\xbd\x74\x42\x26\x3f\x46\x07\xfd\x4e\x7b\xf1\x13\xc7\x32\x84\x45\xc0\x80\xa3\x79\x68\x47\xfc\xd2\x7e\x8a\x3d\x83\xe5\x70\x8e\x05\xb9\x1d\x92\x79\x9f\xc6\xd6\xc3\x4e\x40\x8c\xe4\xc0\x33\x22\x7e\x69\xc9\x54\x30\x09\xc1\xc2\xf1\xb1\xff\xb6\x1a\x14\xb4\x9e\x62\x4f\x0c\x24\x7a\xd8\x69\xb7\x86\x32\xd5\x15\x21\xa9\x49\x80\x57\x64\x95\x1c\xe9\x18\xce\xab\x18\x4e\x81\xae\xc0\x8d\x7c\xaa\x3b\xd1\xa5\xd9\x24\x64\xd6\x86\x4c\x41\x2b\x32\x12\x3b\x24\x17\x96\x06\x16\x0e\x4d\x11\x86\xce\xaf\x4d\x8d\x5c\x70\x2c\x9e\xd8\x04\x3e\x73\x58\x21\xe6\xbc\x24\x47\xb2\x35\xfc\x92\xdf\x01\xf1\x9c\x4c\x7c\x32\xb7\x59\x6c\xa9\xe3\x64\x30\xf1\xe3\x3e\x1d\xf1\x2b\x54\x66\xa0\xc1\xcc\x66\xc9\xdc\xa1\xa9\xd8\xe9\x49\x2b\x7b\x1d\x2f\x07\x84\x94\x0e\x42\x03\x1a\x2c\x99\x4f\x74\x2a\xb7\x88\x04\x4e\x1a\xe2\xc2\x6a\xf0\xd1\xa0\x41\xe1\x13\x9f\x84\x36\x0b\xd2\x01\xce\x8b\x8a\x8c\xf7\xd4\xae\x9d\xc9\x18\x30\x06\x2a\x10\x25\x75\x95\x09\xab\x04\xb5\xe5\x0d\x64\x3c\xb1\x74\x6a\x69\x47\xa2\x67\xf6\x24\xcc\xee\x0d\xbf\x0e\x72\x72\x35\xd1\x84\xf9\x44\x73\xa0\x9d\xb7\x32\x53\x13\x72\xab\x21\x2c\x8d\x48\x5c\x4c\x08\x32\x1b\x10\x19\x74\xf5\xe1\xd2\xd2\xe0\x93\x1d\x92\x6b\x8b\x30\xb0\x41\xc8\xac\x27\x97\xd3\x0c\xad\x1e\x80\x56\x24\xf9\xa6\x2e\x2e\x4c\xed\x71\x69\x84\xcf\x38\xd2\xa5\x49\x08\xb1\x41\x98\x41\x57\x8c\xfb\x46\x48\xe6\x1c\xcb\x60\x0e\x0b\x32\xbb\x27\x7a\xa6\xd6\xf4\xdc\x75\x77\x31\x78\x02\xe4\x28\xa7\x02\x6b\x15\x7b\x5c\x6f\xa3\xa3\x89\x15\x09\xd8\x44\x7b\x4e\x39\x76\x86\x39\x3d\x6a\x3d\xf2\x1f\x97\x06\xbb\x5a\x18\x21\x08\xac\x06\x3f\xb3\x7b\xfc\xd2\x0c\xc1\x93\x43\xb7\x96\x76\x68\x2f\xed\x1e\xf0\x07\x04\x58\x19\xda\x6a\x69\xe8\x14\xb4\x68\x3c\x37\xb4\x67\x38\xd1\x05\x38\xd0\x9e\x67\x0e\x0b\xd6\x0e\x8d\x35\x06\x61\x6b\x39\xd1\xf9\x27\x93\x6e\x15\xef\xc7\xfb\x13\x6f\x12\xf1\x70\xa2\xa5\x7d\x8e\xa6\x12\xc3\xa7\x2c\x2d\x6f\x07\x2e\x51\xf3\x2a\x91\x1c\x8d\xa7\x0e\xdd\xc6\x39\x06\x77\x46\x39\x85\x99\x2c\x58\x70\x3d\x21\x35\x34\xb0\xe2\x3a\xdd\xd5\x28\xa7\xa0\xd5\x13\x20\xc7\x82\xa6\xa9\x8b\xde\x50\x49\x3d\x23\x0c\xfa\x06\x4b\x2e\x0c\x31\xee\x4f\x08\x06\xe3\x3a\xcd\xa5\xa1\x4b\x4f\x83\x06\x7a\xc7\x56\x6e\x20\x99\xe6\xad\x60\x40\x30\x5f\x1d\x9d\x87\x83\x88\x87\x36\xfb\xe8\x8d\x3b\xab\x48\x52\x49\x96\x5f\x25\xd6\x44\x4f\x70\x3b\x54\xb3\x09\xf1\x9c\xe8\x62\xb2\x98\x68\x38\x1c\x6b\x55\x79\x4d\x48\x4d\x31\xf1\xd1\xfb\x39\x3a\x9f\x8e\xb5\xad\x9c\x6c\x96\x79\x32\x09\x26\x32\xf4\xe1\x62\xbf\x5f\x85\xa5\x25\x93\x2d\x47\xc3\xab\xf6\xc9\x99\x1b\x81\xdc\x90\xf1\x27\x8b\x0d\xfa\x86\xd6\x9a\x4d\xc2\x67\x68\x74\xf0\x96\xa1\x0f\xfb\x46\x83\x8a\x26\xc4\x0c\x4e\x88\x94\x74\x35\xb0\xa6\xbd\x9a\x27\xf0\x64\x35\x78\x78\xc8\xd3\x84\x20\x73\xe3\xa3\x78\xd2\x84\xa5\x1d\xaa\xaf\xf2\x64\x85\x8f\x7d\x24\x2b\xda\x4b\x9e\x26\xba\xe8\x8d\x7d\x12\x3a\xec\x70\xe9\xea\x20\x2b\xe5\x49\xae\x07\xa1\xb8\x74\x58\x31\x43\xba\x6a\x45\x62\x56\xe8\xe4\x11\x59\x1f\x96\xd9\xbc\x9b\x2e\x05\x03\xad\xc4\xc6\x81\xc6\x27\x4e\xfb\xfc\xfb\xed\xeb\x3f\x5c\x0e\x08\x01\xd9\xc7\xd2\xce\x1f\x1b\x74\x08\x16\x13\x8d\x4f\x0d\x4d\x2c\x65\x1a\x3a\x2b\x83\x10\x62\x43\x13\xe6\x63\x1d\x42\x7b\x95\x30\x0a\x36\xe9\xd3\xa1\xb1\xb4\x7d\x6a\xe6\xf4\x24\x68\xe9\x14\xc6\xb1\x70\xc1\xf5\xd2\xe7\x81\xdf\xc4\xa7\x48\xbf\xd8\xc7\x3e\x7a\x4f\x8e\xc6\xb2\x5a\x46\x76\x08\x56\xd6\x1a\xcf\xcd\x1e\x48\x06\x3a\x1f\x1b\xda\x2a\x13\x72\x7c\x6d\xe8\x3c\x61\xe8\x5c\x66\x87\x33\xdc\x94\xf1\xa5\xdd\x93\x12\x8b\x68\xcd\x90\x8d\xd8\x2c\xbe\xe6\x68\xbc\x85\xe8\xdb\x0d\x69\x66\xb1\x2b\x6f\xa2\x27\x6b\x43\x1b\x22\xbd\x9b\x59\x1a\x43\x70\x2c\xf3\xd5\x26\xc0\xd3\x40\xc3\x97\x56\x08\x31\xab\xc1\x79\xbb\xba\x39\x50\xb8\xc5\x50\x69\x2f\x86\x32\x55\xeb\x53\x66\xf4\x84\x00\xd5\x2b\x74\x55\x17\xe0\xa4\x01\x72\x53\x97\x5a\x1c\x2b\x2d\x27\x44\x06\x6d\x9f\x5a\xda\x2c\x58\xd8\x0d\x21\x1d\xe8\x14\xb4\xc3\x95\x77\xd8\x07\x1c\x3d\x09\x39\x96\xcf\x0d\x8d\x99\xd3\x7e\xdb\x33\xb5\x89\xa7\xe1\xa9\xc7\xf7\xb2\x8d\x5c\xa6\x72\x3b\xb3\x7a\xa2\x27\xc8\x94\xa3\x2b\xa9\xe7\xb0\x33\x68\xf9\xd4\xda\x62\x01\xb4\xe9\xf6\xf3\xb0\x93\x7a\x86\xf6\x5c\x60\xb9\xcb\x42\x8c\xeb\x74\x1f\x38\xd6\x48\xe8\x50\x5a\x5a\xa1\xba\xc1\x65\x43\x6e\x07\xfd\x5e\xf9\xdd\xd6\xba\xde\x94\xa6\x22\x24\x4f\x8e\x69\xcd\x26\x11\x8f\x0d\xe4\xe0\xc0\x8e\x85\x96\x4d\x08\x98\x45\xb7\x82\xc1\xba\xfd\x3c\xd0\xa4\xc4\x26\x18\xdf\x62\x91\x4c\xc8\xdc\x90\x5b\x4f\x16\xd1\x0a\xb9\xce\xea\x91\xc7\xc0\x58\xf2\xed\xbe\x49\x80\xdc\x0a\x41\x8a\x74\xde\x0e\xc1\xd4\x2e\xf1\x30\xb7\xfc\x36\xc9\xf5\x56\xcb\x49\x08\x17\x83\x86\x94\x3b\x9a\x5a\xea\x75\x54\xb7\xd1\xce\x06\xba\xd0\xb2\x1b\x12\xb4\x0a\x2c\x85\xb9\xa1\x3b\xa8\xaf\xb2\x09\x81\x07\x48\x07\x26\x9a\x14\x0c\x4a\x9c\x26\x85\x8e\xb8\x1e\x34\xa4\x27\xbb\xa8\x87\x64\x8b\xcf\x2c\xe4\x0b\xdb\x49\x68\xea\x3c\x74\x08\x26\xb5\x68\xfc\xc9\xd2\x44\x84\xef\x33\x83\x15\x4b\x9f\xd4\xc1\x30\xa1\x83\xec\x45\x58\x21\x9a\x36\xe2\x4d\x63\x16\x45\x5c\x10\x22\x3f\x08\x1a\x08\x93\x07\x9a\x90\x21\x9f\x3e\xd0\x98\xc0\xa0\xf1\x95\xd5\xe0\xb1\xb1\xc2\xe5\xc3\x27\xee\x78\xdd\x03\xfb\x7c\x61\x8f\x8d\x03\x1b\xa3\x5f\xca\x4e\xc3\xe0\x48\x65\x80\xaa\x8b\x31\xaf\x84\x4c\x66\xc8\xd4\xda\xd5\x05\xcc\xd0\xf0\x80\xf6\xa0\x3a\xd1\x6c\xcf\x0c\x49\xdc\x0e\x5b\x33\x8b\x15\xfb\x34\xa8\xe4\xa5\x49\x53\x29\x84\x29\x92\x33\xc7\x90\x1d\x05\xc3\x85\xb1\xc6\xe4\xd6\x2a\xee\x6b\x98\xc1\x2b\x8c\xc4\xa8\x10\xeb\xd3\x6a\x6b\x66\x69\xaa\x67\x69\x64\x60\x6a\x46\x8b\xf6\xa0\x30\xd1\xa5\x27\x93\xa6\xfe\xb0\x1a\xa8\xdf\x98\xd4\x68\xc7\xbc\x1a\x82\xcc\x6a\x18\x50\x6f\x38\x89\xc5\x4a\x4f\x13\x9d\x0f\x38\xe6\xb1\x4f\x03\x1e\x5a\x1a\x49\x18\x32\xa5\xca\x2a\xce\xa8\xb8\x44\x29\xa0\xdd\xa7\x61\x36\x06\x40\x12\x01\x90\x1c\xda\x83\x23\x84\x29\x1c\x6b\x2c\xed\xc8\x99\xd9\x21\xe2\xb3\xf4\xad\xc3\xa7\x20\x1f\xae\xdb\x35\x9e\xcd\x5c\x9f\x4a\x2d\xc2\x49\x2c\xbf\x9d\x99\x62\xf1\xf7\x6c\x42\x08\x4b\x47\x6b\x61\x5c\x4f\x80\x0e\xdd\xce\xec\xbc\xed\xf3\x8c\x00\x44\x28\x74\xd4\x00\x8a\xa0\x0b\xc7\x4a\x00\xbb\x9c\x17\xf7\xed\x06\x5c\x23\xff\x35\x69\x48\x29\xd7\x13\xb0\x89\xce\x63\x5b\xdb\x6b\x15\x98\x60\x6a\x02\xa4\x43\xe6\x2b\xc7\x32\x4f\xf6\x4e\x7b\x03\xad\x94\x05\xe7\x8b\xb1\x4d\x80\x80\xa3\x71\xc8\xd1\xce\x7a\x4a\x37\xff\x18\x34\x9e\x1f\xf9\xbc\xfd\x38\xee\xac\x7c\xbe\xcb\x74\x54\xc8\x33\x2a\x46\x02\x35\x10\x18\x59\x15\xfd\xbe\xcc\xf5\xe9\x00\xef\x2a\x2a\x14\x44\xd5\x61\xc6\x32\x17\xb8\x38\x2f\xca\x2a\x4e\x49\x98\x0a\x79\xf9\xf1\x8f\xa9\xfc\x18\xb8\xd8\xb6\x0c\x97\x0f\xff\x18\x34\x30\x1f\xd9\x64\x85\x0d\x2b\x07\xf9\x7e\x9a\x0b\x14\x55\x12\xaa\xba\x47\x9f\xab\x90\xe2\x15\x95\xe9\x49\xa8\xdd\xe2\x5d\x9e\x97\x06\x41\xe2\x4e\x3b\xee\x5b\x5a\x16\x98\x3a\xe7\x0d\x08\x80\x4d\x72\x72\x66\x87\x8f\x99\x1d\xb5\xfb\x45\x6c\xa7\x4c\x30\x8e\xc6\x03\xa4\x63\x63\x9a\x0b\xc4\xa2\x9d\x16\xa5\x76\x61\x47\x54\x79\xa0\x04\xd2\x50\x92\xb9\x8d\xce\x4e\x74\x7e\x39\xd0\xf9\xd5\x80\x60\x02\x4b\x83\x8b\x81\x26\xcc\x06\x1a\x8f\x5b\xa1\x94\x1a\x72\x6b\x65\x68\x58\x7f\x42\xcc\x96\x0e\xd1\xf4\x06\x80\xf3\x50\xac\x3b\xec\xc4\xcf\xc3\x4e\x7b\xc5\xd1\xfb\x34\x0e\xed\x01\xf5\xd5\x84\x20\x17\x46\x08\xa3\x01\x81\x07\x96\xdc\x7e\x1c\x77\xc1\x58\xf2\x12\x41\xea\xe2\xac\x1a\x90\x23\xd0\x05\x23\x89\x01\xb2\xd2\xc1\x22\xbe\x8b\x64\x67\xc8\x0a\xd6\x52\x25\xb5\xd5\x05\x80\x1f\xf2\xab\xa2\x6c\x29\x0b\xa5\x2e\x53\xca\xb7\x7a\xa6\x28\x38\x90\x45\x0c\x30\x0a\x34\x78\x44\x53\x51\xc1\x08\x14\xf4\x9e\xc7\x22\xc6\xa8\x28\x16\x3e\x28\x2b\x2b\xd8\x33\x33\x46\x3c\xa3\x3e\x05\xc2\x18\x00\xbe\x23\x01\x7e\xac\x74\x01\xaf\x40\x41\x15\xd5\x56\xa7\x68\x8f\x9e\xc5\x56\x43\xc0\xac\xc2\x36\x83\x88\x0e\x10\xff\x3b\x7d\xd0\x30\x66\x36\x7a\xdf\x9e\xfd\x12\x47\x0b\x3b\x15\x97\xb5\xce\x96\x32\xd8\xea\xe8\x1e\x0e\xe0\x60\x61\xea\x92\x43\x07\x4c\x88\x6c\x7a\xac\x1d\xd1\x69\xc8\x43\x5b\x07\x08\xaf\xd6\x47\x9f\x7b\x89\xa5\x12\x20\x77\x42\xf8\x64\x00\xac\x2f\x69\x2d\xc2\xd4\xf9\xa5\x15\xe2\xc8\x4f\xb3\xa6\xf6\x0c\xc7\xf2\x89\xbe\x11\x13\xc6\x65\xc1\x93\xda\x90\x66\x76\x24\x89\x76\xa8\x92\x03\x99\xc4\xed\x06\x57\xe2\x37\xb1\xd1\xd1\x7a\x4c\x00\x15\x6f\xb7\x8e\x48\x0e\x1a\x60\x6d\xfb\xa4\x6f\x6a\xcd\xa5\xc1\x92\x4f\xc8\x2f\x70\x3d\x1e\xb7\x7c\xca\x46\x7e\x6e\x20\x17\x7c\xe4\xae\x4e\x2d\x4d\x64\xef\x74\x49\xdf\x26\xf8\xc4\xf2\x49\xc1\xd0\xa5\xdc\xd4\x84\xb5\xa4\xcf\x30\x43\x6b\x95\xe3\x11\x66\xd5\xe7\x0a\x4c\x9e\x2d\xed\x86\x54\xc4\x2e\x1c\x0d\xb8\xed\xef\xa5\x4d\xf3\x6a\xd3\xd3\xdb\xb1\x57\x60\x74\x88\x55\xdf\xf1\x8c\xeb\xf0\x51\x5d\xd6\xf1\xdb\x65\xdf\x94\xfd\x80\x74\xfb\x6b\x65\x43\x99\xc1\x62\x0b\x9b\x05\xd9\x6e\xd9\x72\xcc\x03\x30\x67\x1d\xef\x7c\x4f\xbe\x56\x65\x76\x6d\xb8\x6e\xaf\x63\xe8\x3c\x86\x70\xd9\x90\x5f\xb4\x55\x97\x61\xd1\xb8\xcb\xe9\x82\x85\xc1\x80\xdc\xaa\xe8\x48\x90\x1f\x2b\x50\x62\x94\x40\x02\x6a\xb0\xaa\xcb\x0e\x2d\xc2\x89\x0c\x9d\xf3\x44\x82\x5c\xd8\x04\x99\x1a\x72\x25\x4b\xf5\x79\x69\x60\xcf\xd0\x09\x41\xca\x31\x08\x73\x5b\x89\x15\xda\x75\x3d\xd1\x0e\x21\x31\xd1\x25\x28\x13\xa0\x75\x86\x1f\x05\xf9\x81\x09\x01\x98\xfd\x31\x61\xc9\x57\x8d\x81\x92\xda\xd2\x64\x64\x1f\x01\xce\x28\x50\x3c\xac\x2b\x5b\xc4\x33\xe4\x68\xe9\x85\x8d\xd5\xf2\x54\x09\xe4\xc3\x04\xa8\x86\x64\x6a\xa8\x55\x4c\x16\x0a\x47\xeb\xc8\x6a\x4b\x01\x5d\x66\x24\x62\x6a\x5f\xd2\x67\x70\x82\x0b\x98\xd5\x68\x9f\xd0\xaf\xe2\x19\xea\xff\xbe\x1a\x82\xb5\xc3\x32\xb9\xd3\xc1\x67\x56\xcf\x99\xb9\xfa\x70\xfb\x1b\x23\xc0\xc9\x1a\x7b\xa6\x61\xe9\x33\x14\x16\x66\xa6\x2e\xf1\x56\x24\x41\x3b\x32\x66\x56\x07\x43\xf8\x65\xc9\x5a\x0b\x95\x4f\x2d\x06\xeb\x03\x82\x59\x38\x2c\x08\xc4\x28\x20\x2d\x1d\xa4\x0e\x1b\x64\x8e\x2e\x20\x9b\x43\x34\x22\x43\x17\x8f\xc6\xe9\xfb\xb6\xc5\xe4\x56\x8e\xe7\x36\xbd\xc1\x3e\x4a\xc4\xf9\xa9\x1a\x80\xfa\x9d\xa7\xb2\x2a\x92\x7c\x2e\xa1\xdf\x65\xa9\xc6\x22\x15\x76\xf9\x55\x42\x15\xd8\x07\x49\x84\xdf\x53\x11\x7b\xe6\x25\xb5\xa5\xea\x98\xc0\xa8\x50\x9a\x8a\x18\x29\x28\xc5\x38\xbf\x45\x29\xaa\x5a\xd0\x28\xca\x07\x8c\x28\xab\xc2\x50\x46\x38\xd8\x2d\xca\x16\xf1\x81\x82\xb5\x46\xa2\x8a\x23\xdc\xec\x8a\x40\xa2\xc4\x80\x51\x24\x40\x52\x22\x26\x8c\x41\x41\x77\x43\x67\xfb\x5c\x65\x3a\x22\x46\x02\x05\x4a\x9b\xba\x0a\x86\x53\xb2\xda\x9a\x2a\x01\x23\x94\x98\xbc\xc5\xd9\x81\x2f\x75\x14\x06\x28\xa0\x0b\x64\xb5\xcb\xc8\x88\x5f\xa9\x4b\x0a\xa2\x0a\x47\x45\x79\xd9\xee\xa3\x31\x3e\x08\x18\xa0\x30\xd2\x54\x65\x78\x46\x0a\xe0\x64\x2c\xdb\xc1\xce\xef\xa2\x1a\x00\x56\x06\x5e\x54\xe2\xf3\x96\xc7\xb1\x5a\xc6\xde\x6a\x08\x02\x99\x65\x30\xa5\x41\x41\x0b\x0a\xb1\xa9\x19\x98\x0a\xdb\x7d\xa4\xb3\xe5\x7b\x00\x45\xed\x32\x1d\x49\xc1\x65\xb5\x9d\xc8\x2a\x43\x0a\x0a\x26\x31\xa8\x1d\x15\x52\xc5\x77\x7e\x95\xc8\x6a\xb7\xf6\xe7\xf6\x8e\xcf\xb5\x4f\xf6\x2b\xc2\x71\x83\x26\xab\x18\x0d\xdb\xfa\xcf\x48\x40\x7a\x94\x4c\x08\x75\x6f\xfc\x05\xb4\x56\xe2\x30\x58\x5f\xd4\x0c\xcc\xd0\x39\xb2\xd6\xdb\x9d\xf2\x48\x47\x9f\x1d\x0d\xc5\xbe\xc3\xa3\xcf\x69\x98\x29\x35\xc6\xeb\x62\xb2\x6f\xa7\x5d\x23\xb1\x58\x95\xac\x70\x0c\xf1\x55\xc4\x98\xa6\x66\x6f\xfd\x72\x00\x9a\x86\x26\x28\xa5\x1d\x50\xb9\xa1\x60\xd9\x09\xac\xce\x38\x1a\x0f\x39\x1a\x8c\xf6\xea\x74\xb0\xa5\xa3\x0b\xf9\xa0\xc4\xe9\xc0\x22\x84\x39\xc2\x24\x3b\x02\xdf\x8a\xcf\x90\x2b\x62\x2d\x72\xab\xf7\x80\xe4\x25\xba\xc2\x38\x4d\xf5\xaa\xf8\x65\x2a\x02\x8a\xd7\xb1\x4a\xa7\x19\x12\xf9\x6a\x64\x07\x63\x45\xc5\xc7\x0a\x24\x0b\xdd\xac\xdb\x34\x64\xea\x35\xfd\xde\x69\x5b\x1a\x2b\x2a\xc3\x1f\xa9\x3f\x90\x00\xd4\x44\x00\x86\x80\x21\x6b\x5d\xdc\xa9\xb7\xaf\x93\x3b\xf5\x10\x96\x95\x76\x01\x04\x51\x54\x85\x5d\x9a\x1b\x1d\xac\x7f\xb3\xe4\x76\x6e\xe4\xd5\xbb\xea\x6d\x0f\x8d\x6f\x46\x4f\x1e\x26\x74\x86\x75\x5b\xc4\x61\x8c\x35\x3a\x88\xdb\x76\xfd\x15\xea\x8f\xdd\xb8\x63\x33\x6e\xe8\xc4\xa7\x9f\xd5\xb2\xd6\x27\xbb\xb1\xcc\xd7\xdd\xef\x6e\xe5\xbf\x79\x66\x13\xef\x96\xfc\xf5\x76\x75\x8b\x5c\x8d\x8f\xc7\x0b\x6b\xf4\x8c\xa3\x71\x8c\xeb\x0c\x89\x61\xa7\xc4\x6a\xc0\xc2\xcc\xd0\x48\xdc\x61\x10\x7e\x53\x8a\xa1\x0d\xc9\xe1\x7a\xb2\x1a\xb6\x13\xd9\xd0\x4b\x8c\x1e\x6b\x4c\xea\x10\x4c\xcb\x5e\x6d\x7f\x53\x09\xf0\x34\x56\xba\xfd\x2a\x4e\x19\x9a\x1a\x9e\x38\x5d\x88\x70\x3a\x77\x42\x26\x1d\x2b\xc5\xd8\x84\xaf\xe7\xd9\x74\x31\xd1\x27\x5a\x0b\x33\x34\x89\x76\x15\x3c\x73\xb4\x67\xcc\x94\x71\xdc\x2e\x6c\x4c\x9a\xd9\xa1\x03\x9d\x76\x3d\x37\x21\xcc\x1c\xba\xfd\xdf\x27\x6d\x69\x67\x9e\x60\xdc\x79\x2e\xea\x88\xd8\x33\x50\x71\x34\xd6\x22\x8b\xbe\x17\x55\xa1\xa3\xe0\x28\xfe\xc4\xa9\x62\xce\x00\xf0\xd0\xe8\xce\x66\x4e\x97\x5c\x19\x5a\x4b\x31\x59\x18\x3a\x5d\x21\x75\x10\x7e\xe8\xdc\x8b\xfa\xbb\xba\x33\x56\x79\x5a\x11\xbf\x09\xab\x8f\xe9\x31\xaa\xb3\xf3\x3b\x25\x4b\xaa\xc1\x6b\xb4\x5d\x61\x67\x4d\x43\x24\xc5\x72\x4e\x4c\x36\x34\x89\x9b\xe8\xd2\xd8\x66\xc1\x42\x25\x66\x89\x11\x49\x08\x53\x4f\xf1\xfb\x7d\xb1\x76\xdb\x07\x0b\xbb\x8e\x75\xd1\xb8\x82\x76\x50\x7f\x44\x34\xcc\x80\x55\xce\x73\x51\x06\xf2\xed\x4f\x78\x8d\x57\xdb\xf2\x22\xd2\x27\x06\x37\x75\x1e\xda\xeb\x63\xcf\xe3\xbe\x86\xd7\xf8\x0b\x1c\x3a\x00\x0b\x27\x84\xb9\x45\xb4\x32\x34\x96\x2f\xe2\x29\x05\xdb\x9d\x2f\x59\x5a\xa1\x91\x18\xd5\x58\xcc\xd2\x48\x14\xcb\x2f\x6d\xef\x87\xc4\xd4\x3b\xe3\x93\x36\x94\xe9\xcd\xef\x35\x16\x8f\x36\x58\xac\xf3\xd9\x0e\x1e\x6d\xfc\xb4\x8e\x9d\xc4\xb3\xc3\x32\x85\x5e\xa9\x38\x45\x89\xd8\x1e\x8e\x52\xa0\xcb\xd0\x22\x10\x98\xad\xfe\x48\xa5\x6e\xc8\x5b\x2c\x3f\xe6\xf7\x0f\xb1\x73\x63\x3f\x3b\x3e\xe0\x85\x4f\xdf\xa1\xa9\x42\x6a\xaa\xa8\x64\x77\xfb\x1b\xe6\x0d\xb7\x71\x30\xc2\xcf\xdc\xd1\x9a\xbb\xfa\xb4\x99\xf7\x18\xf9\xa7\x9f\xbd\x65\x1c\xb0\xd5\xe5\x92\x87\x9d\xfe\xff\x79\xb1\xac\x98\x53\x93\x66\xd6\x4e\x5c\xaa\x41\x20\x4b\x80\x14\x15\x9c\x57\x45\xf5\xb9\xe8\x0b\x09\x08\x8a\x8e\x39\xb2\x82\x03\x51\xc7\x60\x57\x5d\x63\x11\xcf\x50\x63\x15\x4a\x94\xd2\x45\x7d\x0d\x14\xb5\x7a\x2e\xab\x92\x82\x62\xd6\x17\x74\x36\x71\x2b\xec\x16\xb6\xdf\x25\x65\xd0\x65\x86\xf5\xef\xb2\x2a\x46\x74\xc0\x98\x00\xf0\x8c\x8e\x57\xb4\x19\x92\x51\xba\x40\x13\x81\xc4\x48\x0c\xd9\x53\x03\x12\xa8\x0c\xc9\x4b\xcc\x10\xe1\x57\x4d\x7b\x5b\xa6\xbb\xc7\xc3\xaf\x83\x99\xa0\xea\x87\x76\xb2\x91\x97\xdc\x25\x15\xd0\xdd\xf0\x3a\x54\x30\x81\x2a\xe6\xc0\xfc\xd6\xcc\x60\xf1\xc4\xf2\x9b\x48\xe7\x44\x11\xf0\x8c\x02\xa5\x3a\x1e\xaf\xf9\xff\xce\xb1\x6e\xad\x37\xdf\x71\x1e\xe3\xcc\x18\xed\x7d\x73\x1c\xc5\x38\xac\x98\xd3\x9d\x68\xab\xcd\xb8\xb2\xb0\xc3\x1e\x0f\xc7\xf2\x89\x18\x37\xc4\xbc\x81\x36\x29\x62\x96\xdd\x3a\x27\x62\x1d\x84\x27\x9b\x38\xd7\x64\xc9\xb5\xc3\xd6\xf1\xaf\xb7\xf9\xbd\xc6\x6a\x65\x8b\xe1\xb9\x25\x7f\x73\xcc\x7b\x99\xfd\xe6\x3b\xed\x80\x04\xa8\x01\x98\xd6\xf6\xb8\xd3\xd6\x7e\x0c\xfe\xa2\x1c\x18\x4a\xc0\xa0\x40\x17\x74\x4f\xd1\x96\xba\x8c\x2a\xaa\x3c\xa5\x62\x60\x8b\xe9\xcc\x0f\x89\xb3\x8f\xd9\xd1\x96\x26\xc3\x8b\x3a\x86\x8f\xa5\xae\x7a\x74\x8e\xc8\xa6\xdb\x98\xd0\x11\xbf\x8e\x3a\x22\x26\xd0\xdb\xd8\x7c\xf8\xc4\xe5\xc3\xa7\x38\x47\xff\xff\x73\x63\xee\x0d\x5e\x5c\xe4\x5b\xbe\xc1\x7f\xc4\xc8\x76\x38\x1a\x97\xb9\x5e\xf5\x0e\x80\xc4\x47\x21\xe9\x17\xeb\xd3\x0c\x99\x8f\x22\x63\x66\x43\x32\xb5\x08\x67\xea\x74\x92\xf5\x90\xae\x7d\x25\xb9\x72\x68\x72\x77\x4d\x7e\x69\xb1\x70\xe1\xe8\xb3\xcc\x22\x5a\x33\x83\x00\x8b\xbd\x79\x6c\xbd\x5d\xcb\x21\x35\x35\x6e\xe9\x10\x4c\x59\x86\x26\x85\xdd\x75\xfd\x12\x5b\xd5\x85\x4c\x80\x16\x08\x19\xdc\xea\x89\x0b\xb5\x21\x15\xeb\xa9\xd5\xba\x22\x31\xd1\xb9\x62\x0d\x9e\x0b\xf1\xc0\x26\x44\x9f\xa3\xf9\xcc\x60\x31\xbf\x5c\x8b\x3f\x8f\x71\x06\x4b\x36\xac\xf0\x79\x39\xd1\xc4\x8c\xef\x21\x9e\xf0\x27\x3b\x04\x01\x8a\xfb\x4c\x8d\x49\xed\x7c\x1f\xf7\x0a\xec\xdc\xc6\x9c\x5d\x43\x17\x9e\xec\x10\xae\x1c\x16\x2e\xad\x27\x5c\x34\x74\x3e\xb1\x08\x29\x99\xe4\xed\x00\xc9\x86\x63\x85\xdc\xd0\x24\x84\x55\xc9\x44\x7b\x5e\x73\x3d\x1e\x1a\x11\x0f\x6d\xc2\x3b\x1c\xe7\xab\xae\x4e\xc1\xb1\x46\x2e\x0c\x5d\x88\xad\x86\x78\x14\x7f\x2c\x96\x7c\x9a\x68\xab\x0d\x0e\x39\x44\x2b\xb5\x08\x26\x18\x68\xfb\xed\x0c\x22\x21\xe6\x68\x09\xc9\xe7\x62\xbc\xbf\x40\x16\x98\xa9\xe1\xd0\xf6\x37\x31\xc4\x66\xbe\x43\x62\xc1\x7a\xd2\xe0\x93\x72\x4d\xb6\x49\xaa\x2c\xc8\xcd\x62\x0d\x6a\xe8\x95\xb4\xa8\x03\x5a\x54\x6e\x68\x46\x8e\xde\x15\x61\x7c\x31\x3e\xd4\x79\x87\x0e\xc8\x85\x18\x92\xcb\x6a\xfe\x6e\x65\x69\x70\x51\xfc\x46\x30\xa9\xa1\xb5\x82\x89\xce\x91\x43\xfa\xf1\x79\xf8\x14\xaf\x86\x9d\x18\x8d\x1f\xa9\x09\x21\xe0\x76\xc8\x3c\xb9\xa0\xa8\x83\xdb\xc5\x9a\x58\xbd\x0e\xfc\xec\xd0\xd0\x99\x21\x9f\x62\x74\xf9\xd6\x58\x97\x12\x4b\x03\x39\x7a\x97\xbd\x39\xbd\x7a\x1d\xb5\x8e\xa3\xca\x38\x3c\xb5\x08\x61\x66\xd1\x9b\x78\x7c\x23\x9f\x49\x83\x87\x06\x0b\x16\x0e\x0b\x67\x56\x6f\xb8\xb0\x09\x6f\x33\x46\xe4\xf2\x6e\xd5\x3f\xfc\x0c\xf5\x73\x9d\xbe\xeb\x88\x71\x5f\xc4\x48\x41\xed\x92\x23\x14\x07\x8d\x65\xde\xe6\x3b\x5d\x9f\x0e\xc1\x93\xc9\x3e\x7a\x5c\xb0\xed\x4f\x8e\x59\x05\xbb\x65\x5f\xe8\x91\x17\xf7\x41\x17\x08\x2a\x43\x76\x65\xc0\x91\x3a\x2d\xc6\x96\x96\x61\x86\x86\xa3\xb1\x77\xd0\x17\x13\xe8\xf6\xca\x35\xb9\x1a\xcf\x45\x8c\x1c\x49\x01\xec\xe9\x98\xc4\xab\x4f\xb8\xcd\xd3\xb3\xcc\x44\x76\x8e\xec\x51\x13\x93\xed\xba\x13\x44\x38\x90\xd4\x6b\x6a\x13\x82\xc4\xad\x48\xf4\xaa\xf7\x58\x17\xeb\x55\x38\xa0\x55\x4c\x90\x65\x40\x15\xf3\x80\xb2\x2a\xfa\xb4\x97\x60\x76\xc8\xac\x38\x9a\x7f\xb2\x58\x30\xb3\x22\xb0\xe2\x7c\x8a\xd1\xba\x50\x45\xfa\x57\xff\xd6\xa7\x03\xcf\x5d\xc5\x1e\xc7\xee\xad\x73\x79\x1c\x93\x59\x1c\xcd\xdb\x3c\x23\x31\x0a\xa0\xa6\x52\x17\xca\x9c\xdf\x26\xa7\x28\x26\x67\xf1\xd5\x20\x6f\xce\x39\x06\x77\x8a\xf5\xf4\x72\xee\x2a\x37\x7c\x6a\xaf\x3c\xc2\x50\x0d\x4f\x3d\x0e\xae\x82\xa3\xef\xed\x73\xde\x58\x6f\x7a\x83\x86\x94\xd9\xf4\xe3\xa2\x9f\x53\x8e\x2e\xb7\x43\xbe\x1a\x93\xd9\xe1\xc4\xd3\x69\xa9\xf6\xad\x1d\x05\x6b\xb1\xb2\xea\x94\xb4\x23\xac\x4f\x87\x30\xe4\x98\x8a\xfe\x6e\xff\xf8\x6d\xb2\xc6\x1e\x8e\xc1\x1e\xb8\x9e\x14\x1b\x5a\xb3\xcf\xd1\x54\x07\x00\x5e\xde\x9d\xc7\x95\x02\x38\x94\x14\xcc\x7f\xb1\x16\xe1\x25\xd0\x62\xcf\xd0\xef\x09\x01\xe7\x53\x9b\xfc\x1d\xf4\xbe\x22\x0e\x64\x35\xd8\x8d\x19\x0c\x5e\xe9\xaa\x24\xe7\x93\xc8\xfe\x11\x16\xfb\x83\x86\x33\xab\xd6\xaa\x97\xca\x6e\xde\x4a\x50\xe5\x36\x04\x19\x74\x81\x31\x43\x3e\x62\x00\x05\xcc\x6a\xf0\x70\x40\x14\x98\xba\xe5\xad\x27\x40\xd4\x9e\xa1\x09\xb1\x95\x53\xbc\x85\x62\x34\x16\x06\x5c\x0f\xac\x11\xed\x32\xcf\xa1\xca\x1d\x12\x93\xd0\x14\xe3\xbe\x8a\x81\x8e\x1a\x80\x4d\x2c\xce\x45\xfc\x6a\x00\x56\x81\x8b\xe2\x1a\x40\x8d\x15\xc4\x77\x0f\xf3\xe9\xa0\xc5\x00\xfc\x80\x7f\xb8\x0a\x76\x74\x7c\xa9\xd3\xc5\xbc\xb6\xa8\x60\x2d\x46\x81\x1b\xbe\xc2\x32\x8f\x43\x2a\x74\xdf\xa1\xa9\xc4\xf2\xa9\x87\xa1\xdc\x5c\x08\x3a\xf6\xc0\xb1\xd2\x12\xf1\x3c\xd1\x63\xcf\x24\x40\xcb\x29\xfd\x08\xd2\x65\x84\x47\xc5\x5a\xf2\xc6\xe6\x68\x2c\x33\x8a\xb5\x13\xca\xe6\xbb\x2f\xf8\x29\x72\xc8\x0c\xba\xed\x6f\xf3\xc7\x1e\x8f\xcd\x61\x67\x76\xc3\x78\x1a\x44\x95\x2c\xc3\x4a\xbe\x61\x0b\x3a\x34\xb9\x36\x10\x4e\xeb\xd2\x7a\x80\xaf\x82\x03\xd9\xf8\xa7\xf2\x44\x74\x5a\xda\xe6\xcf\x7c\x63\x0e\x57\x41\x33\x6f\x67\x85\xdd\x1c\x79\xc7\x4d\xee\x89\x87\xec\xf3\xed\xba\xc8\xd1\xd4\x93\x89\x70\xd2\x2f\xf2\x1a\x52\x8b\xb0\xbf\x22\x5f\x63\xb1\x24\x8a\xb9\x02\x25\x00\xfa\x9e\x1d\x88\xa8\x1d\x90\xda\x84\x8a\x62\x2c\x8f\xeb\x09\xd0\xa0\xdb\x99\x29\xb7\x33\x2b\x54\x3d\x7e\xdd\x4d\x07\x18\x18\x49\x34\x55\xf0\x29\xab\x06\x2f\x62\x8c\x2a\xc9\x8f\x9e\x4d\xdb\x48\x36\x23\x09\x38\x53\x11\x03\x32\x60\x48\x56\x56\x9f\x99\x42\x47\xc3\xa0\x5f\xf2\x82\x2f\x0d\xba\xbd\x12\x9e\xda\xab\xd3\xed\xe3\xc4\xd1\x67\x85\x1e\x08\x40\x85\xc5\xb8\x6b\xbf\x8d\xb0\xe6\x99\x82\x13\x62\xb6\xe4\xba\xc6\x0c\x8d\x45\x0c\x9a\xc2\xac\x1d\xdf\xc6\xb1\x02\xb4\x23\x29\x31\x42\xf8\x34\xd1\xa5\x32\x67\xa2\x90\xfd\x8e\xfe\xd3\x05\xfe\xd4\x79\x3d\x7d\xc4\x7b\xed\xb3\x4b\xfe\x29\xbc\xdf\xf0\xbc\x77\xf8\xa4\x7e\x91\x7b\x53\xc4\xa3\x02\x66\xd1\x14\xb4\xc2\x22\xb7\xc7\xdb\xad\x67\x69\xd2\xda\xa0\x4f\xf8\x7a\x2f\xa9\xf3\x53\x9e\x1c\x76\xe5\xd5\x39\x5a\xbb\x76\x33\xd0\xf0\xc0\x92\x4f\xd5\x8f\xfb\xef\xf1\xa5\x05\x4f\xed\xb8\x1a\xa3\x3d\x2f\x27\x04\x93\x6e\xc6\x6a\x0d\x67\x61\xb1\xe4\xec\x08\xcf\x6b\x93\xa6\x10\x9e\xa2\x71\xba\x22\x95\x6b\x61\xbc\x14\xc0\x8e\x08\x24\x46\xc5\x98\xd1\x58\x16\xe3\x22\x8f\x36\x12\xd6\x16\x4d\x35\x05\xa5\xdd\x42\xbe\xce\xda\xcf\x79\x6d\x4c\xea\x3c\x1e\x0c\x4f\x26\x0d\x7e\x69\x13\x64\xe8\xd0\xad\x72\x8e\x57\x6e\x0d\x0c\x1d\x6a\x13\x1d\xa4\x0e\xdd\x52\x1c\x96\xcc\x0d\x99\x2c\xec\x61\x10\x51\xd0\x2a\x74\x97\x5c\x3a\xba\xe8\x0d\x74\x01\x9f\x84\x45\x1e\xac\x37\xa5\xa9\xb5\xa1\x89\xc5\x78\x89\x6f\x0c\x97\x03\x3f\xe9\x28\x4f\xd8\x72\x90\xdb\x09\xed\x25\x99\x49\x48\x89\x5d\xaf\x59\x9f\xc8\x27\x28\xf0\x78\x33\x0f\xda\x0a\x8e\xcc\xfb\x14\xb9\x44\x9b\xfa\x1b\xbe\x36\xeb\x4b\x0b\x83\x26\x97\x4e\x08\x72\x3b\x84\xc1\xb1\xfc\xae\x97\x63\xfa\x16\x74\x7a\xce\xd2\x0e\x53\x14\xcf\xa7\xa6\xd6\x82\x67\xe6\x9f\x02\x43\xab\xf0\xaf\xe4\x79\x13\x1b\x15\xfd\xc2\x90\xc5\xba\xaf\x8e\x57\xf3\x2a\x1d\xac\x94\x7d\x83\xc7\x2d\xbf\xe2\x97\x90\xa0\x51\x62\x75\x5d\x67\xac\x32\x12\xaf\x60\x2d\x65\x2c\x73\x99\x28\xb7\x8b\xdc\xad\xd2\x96\xf0\xae\x8a\x49\x53\x35\x20\x87\x68\x3c\x5c\xe1\x30\x8a\x47\x36\x31\x90\x82\x62\x14\x20\x8d\xd5\x00\x8e\x24\x9c\xec\x89\xb8\x30\x3d\x58\xe3\x26\xf9\x5c\x12\x24\x46\xe8\x1e\xfc\x1e\xd1\x21\x68\x56\xb9\xce\x82\x82\xb5\x78\xd0\x25\x65\x59\x6d\xf5\x74\xcc\xe9\xa8\xf8\xde\x5a\xa5\xac\xe0\xbc\xa8\xb0\x64\x64\xaf\x5e\x6f\x5b\x0d\x40\x0f\xc5\x4d\x63\xd9\x0e\x94\x2e\x89\xf4\x93\x57\xb0\xe6\xd9\xb6\x00\x90\x38\x34\xf6\xd6\x71\xc9\x50\xbb\x2a\x29\xea\x00\x33\xbb\x5b\xdf\x7d\x69\xfd\xa2\xdd\x13\x36\xc2\x9f\xe1\x7d\x7f\x0d\xe0\xa2\x77\xde\xc4\x51\x20\x00\xb2\x8a\xc1\xb1\xf2\x54\xe6\xf6\xa8\x98\x54\x3f\xdb\xe4\xb1\xbf\xd2\x3e\x50\x31\x30\x95\x90\x3f\x00\x06\x55\xcc\x8d\x04\x06\x2f\xe1\xa4\x22\x01\x5e\x93\x11\x3f\x7a\x99\x77\x78\x52\x0e\xb8\xc4\x28\x01\x73\x2c\x5f\xe8\x54\x9b\xdb\xdc\xa1\x93\x34\x8b\x3c\xa2\xe9\x4e\x1e\x03\xc9\xe7\x62\xbc\x33\x1f\x94\xf0\x75\x3e\xac\x3f\x2c\xe2\x68\x87\x85\x0b\x23\x7f\x5f\x1f\x17\x3e\x52\xc3\xd7\x5c\x4f\x5a\x72\xec\x6c\xe6\x84\xaa\x37\x21\x18\xbc\xc8\x71\x63\x4b\x7b\xb3\x42\x12\x43\x6d\x39\xec\xa3\x67\xb2\xe4\xc2\x6a\x80\x9c\x63\x04\x45\xd9\x8f\x11\xbd\x89\xd6\x6a\x71\x2c\x8e\xc6\xd4\x29\xc7\xce\xe0\x44\x37\xa0\xe5\x53\x4b\x2b\x7c\x6e\x71\x6c\xb6\xb0\x1a\xce\x9a\xeb\x39\xb1\x2b\x37\x0f\xc6\xef\x25\xa6\xa3\xf1\x7b\x91\xfb\x4a\x14\x7e\x6e\x4d\x87\xc2\xda\x66\x9f\x13\x87\xae\xf6\x11\x94\xf8\x8d\x30\x75\x6d\x13\xab\xe5\x04\x61\x57\x6f\x58\xfe\x9f\xc6\xbc\x81\xc6\x79\xbc\xd2\x5e\x1b\x74\x99\xa3\x52\xe1\xc7\xca\x24\x82\xa5\xc3\x3e\xaf\x6b\xba\x03\x62\x2f\x4f\xed\x09\xf5\xd3\x00\x6f\x06\x83\x75\xd7\x73\xf3\x84\x2c\xf2\xb0\x58\x40\x0c\x88\x16\x6e\xb1\xab\xfe\x04\x27\x73\x43\x9b\xa1\xf1\xd7\x69\x5e\xab\xd8\x71\x8b\xa7\x45\xec\xb8\xbf\xa6\x53\xfd\x5d\xf4\x3b\xcb\xa4\x1c\x5b\xe7\x77\x50\x33\x47\x23\x33\x3b\xa7\x66\x6e\x24\xc0\x09\x21\x56\xf9\xc6\x02\xc2\xc8\x6d\x3f\x68\x52\xc6\xb1\x42\x6c\x87\xe4\xc2\xd5\xc4\x17\xb9\xc1\xdb\x3d\x03\xc7\xfd\x34\xdf\xdb\xe2\xf6\xce\x7a\x56\x60\x11\x2d\xb8\xe5\x5f\x98\x59\x7e\xc1\x7b\x91\xd3\x6d\x21\xdd\x92\xa9\x27\x8b\x65\xb2\x89\x3e\xf1\x0a\xdf\xd5\x73\x66\x76\xa8\x6e\xe2\xe1\x63\x3e\xb9\xe2\x3f\xe0\xd8\x7a\x7d\xab\xc8\xcd\x0c\x4a\xfa\x08\x6f\x29\x71\xa8\x8a\x9b\x58\xb2\xbf\x89\x3b\x87\x28\xee\xcc\x0d\x8d\x5f\x5a\x0d\x31\xe1\xe8\x49\xff\xe6\xf7\xdf\x3f\xee\xf4\xa4\x0f\xde\xa9\x7f\xd1\x11\x63\xf1\xd2\x9d\x27\xf3\x78\xe9\x57\x5b\x89\xf7\xaf\xf9\x3a\x52\xeb\xda\x77\xdc\x28\x2b\x0f\x4e\x3b\x72\x1a\x5a\xbd\x43\x5a\x4d\xdd\x79\x3b\x4d\x7d\x2f\x72\x8f\x1e\xbf\xb6\xd8\x79\xce\x95\x14\x5f\xdb\xd8\x7d\xea\x9c\x88\x61\x79\xe4\x50\x45\x21\xbf\x3f\x4e\xf6\xe6\xcb\x55\xbd\xe7\xde\x9c\xc7\xb7\xe5\x09\x67\x27\xf7\x94\xfd\xfe\xcf\x62\x73\xf4\x4b\xf1\x5d\x74\x14\xe1\xee\x39\x6a\xc5\xee\xf6\x93\x87\xa9\xbd\x3c\x0d\xf0\xe5\x89\x85\x74\x79\x56\xdb\xfd\xfe\x49\x70\xb2\x6d\x42\x57\x76\xb3\x0f\x3a\xbb\xf0\xf0\x10\x42\x02\xbb\xc5\xbe\x7e\xd8\x21\x84\xed\xea\xf4\xb2\xa2\xed\xfb\x79\x0c\xdd\xb2\x83\x42\x37\x2a\x0e\x8a\xf1\x16\xbe\xf3\x62\x8b\x9c\xef\xec\x4b\xed\xd8\xa5\x5c\xc5\x99\x08\xd2\xf8\xea\xfe\x4a\x72\x4d\xc7\x9d\x1f\x91\xe8\x6b\x7c\x9d\x38\xc2\x66\xf7\xe8\x9a\x77\xd1\xdb\x3b\xb2\x64\x7b\x3c\xc9\x9b\x68\xc9\xe5\x11\x10\xf7\xfb\x47\x41\x20\x6a\xe9\xc2\x2a\xaf\xba\xfa\xed\x92\x23\x23\xb0\x2f\x57\x7e\xe4\xb8\xcf\xa3\xe9\x45\xc5\x6f\xee\x8e\xe0\xd9\x87\x9c\xdd\xb8\xb9\xe5\xeb\xc5\xa1\x5e\x87\x76\xf4\x3e\x15\xde\x58\xdf\xf7\x97\xcf\x05\x56\x7b\xa2\xfb\xbe\xe3\x99\xa1\xcd\x0b\x6f\x63\x3a\x77\x98\x65\xea\x2e\xdd\x79\x09\xee\x47\x0e\x88\x3d\x7b\xea\xc9\x75\x6a\xc7\xc9\x2b\x47\x38\xbf\xdf\x76\x5e\x90\x3b\x76\x80\xb4\xbb\x34\xe1\xa2\x50\x10\xa6\x38\xf8\x37\x2a\x0e\xe4\xbc\x1e\x2b\xad\x63\x67\xed\x5d\xaf\xfc\xc8\x89\x57\xd5\x25\x76\xd7\x63\x05\x3f\x5e\x2c\x33\xe7\x9e\x9b\xd5\x27\x24\x28\xef\x3a\x55\xf6\xaa\x3c\x58\xcf\xcf\xdc\xb9\x6f\x9e\xf6\x72\x26\x84\xa3\xe9\xab\x47\xac\x9c\x39\x96\x06\xf5\xae\x99\xc5\xc5\x71\x27\x03\x37\x4d\x95\x99\x19\x9d\x3b\xb6\x2f\x9b\xcd\xdd\x74\x16\x43\xd4\xad\x0d\xec\x4c\xe1\xb6\x53\xaa\xac\x09\xc7\xbb\xaa\x14\x2d\x20\x3c\x77\xa0\x70\x65\xa2\xbd\xed\x09\x7a\xf4\xcc\xb5\x83\xb3\xa7\x0a\xba\xd9\xdc\xb7\xab\xdb\xff\xae\x3b\x7e\xd2\x5e\x9a\x3e\x34\x2d\x1f\x22\x3d\xbd\xb8\x72\x9a\x98\xc5\xf9\x8f\xd7\xe1\xa6\xe3\xa2\x0b\x3b\x6e\x5f\x5a\x7e\xe8\xb6\x3d\x6f\xee\x7a\x1b\x98\x6a\x2f\xdd\xf9\x05\xc7\x23\x56\xdd\x1f\x47\xb5\x0a\x95\x97\xc8\x29\xb5\xf8\xe9\xfa\xf9\x5b\xcf\xf8\x39\x62\x0a\x57\xef\xea\xab\xeb\xd8\x31\x33\xf3\xee\x25\xa0\x95\xe7\xe5\x0c\xe3\xc8\xcf\xe2\xf9\x9d\xec\x47\x1e\x74\x6b\x83\x18\x2e\x60\xe6\x27\xd0\x1d\x16\xa2\xa6\x6b\x1d\xbf\x28\xfa\x34\x17\x59\x3c\xf4\x33\xdf\x33\x33\xf7\x34\xa8\x98\xf6\xbb\xaf\x72\x2b\xab\x56\x27\x66\x1c\x9e\x37\xb6\x07\xf9\xaf\xdd\x8f\x59\x60\xff\x56\x1a\x5c\x94\xfa\xde\x2c\x4b\xef\x77\xa8\xd7\x68\x55\x9e\x0f\x79\x6b\x7a\x67\x8e\xc9\x5d\xb9\x56\x2f\x8e\x83\x17\x1d\x73\x61\x28\x7f\xd9\xb1\xd8\xbb\xb1\xa8\xb9\x63\x35\xb7\x26\x74\xe7\xd9\xab\x41\xf0\x05\x5e\x6e\x23\x86\xd2\xc8\xda\x88\xe6\xab\x11\xa9\x07\x63\xcb\x7c\x71\xcf\xf0\x47\x79\xc1\xc7\x5b\xac\xf1\xe1\x27\x67\x5f\xe8\x90\x2e\x89\x91\xde\xe0\x7a\x8f\x5c\x34\xf0\xcb\xba\xde\x13\x4e\xf5\xd0\xf7\x7e\xed\xfd\xd5\x5d\xef\xd7\x87\x4f\xd7\xfb\xe9\x7a\x3f\x5d\xef\x7f\x9e\xeb\x75\xdc\xe2\xd0\x3e\xe7\xd3\xed\x6e\x1e\xff\x94\x6e\xf7\xaf\x37\xe2\xfd\x1c\xf0\x36\xce\x5d\xea\xf4\x67\x7b\x5d\xf0\xe9\x75\x5f\x7c\x3e\xbd\xee\x29\x79\x7d\x7a\xdd\xed\xe2\x4b\xe4\x66\x9f\x1e\x77\xf3\xf8\xc7\x79\xdc\xc3\xce\x38\x7b\xb6\xe5\x97\xab\x9b\xfb\x53\xeb\x45\x87\x0b\x44\xfb\xdc\x77\x62\x7b\x11\xba\x51\xd6\xa1\xee\x0f\x28\xa7\x07\xcb\x6e\x27\x0e\xd5\xbc\xba\x21\x1f\xb0\x07\x92\xb0\x5a\xb7\x0f\x0f\x04\x76\xdb\xb4\xa6\xad\x5b\xb3\xd1\x68\xdd\x4e\xf1\x96\x4b\x3e\xd8\x0f\x2e\xd1\x32\x6f\xae\xbe\x5c\xdd\x50\x3e\x84\x7e\xe4\x5d\xdd\x5f\x6d\x5b\xbd\xaa\xc8\x5d\xd1\x71\x54\xde\xde\x18\x1f\x5b\x86\x3a\xa2\x53\xaf\x70\x7e\x5f\xac\xc7\x3a\xee\x3c\x3d\x5c\x2d\x3b\x24\x7b\x36\xb6\x41\xb1\xc9\x2b\xa7\xec\x7f\xab\xf8\x8e\x2e\x69\x21\x9e\x3b\xee\xd4\x8f\xfc\xf2\x0c\xcd\xcd\xb2\xcc\x21\xda\x9c\x5b\x26\xdc\x12\x29\x14\xb2\x65\x39\xa4\xed\x3c\x3e\xde\x4e\xdd\x66\xeb\xb6\x49\xe0\x5f\x6f\xc9\xc6\xa3\x75\x3b\x25\x1f\x9a\x8d\x07\x17\x6f\x35\x5b\xd8\x89\x55\xb6\x64\xbb\x68\x58\x70\x73\x59\xa7\xbf\x4e\x6a\xe3\xd3\x0e\xd6\x25\x5f\x5f\xdd\xfa\x40\x0c\x20\x6f\x31\xfc\x36\x99\xbb\x4b\xdf\x5d\x7d\x0c\x16\x7c\xbb\x3a\x7c\x63\x74\x7e\x0e\xd6\x4f\x81\x78\xb1\x32\xb7\xcf\xe1\xe9\xc3\xa6\x2f\x30\xce\x1a\x14\x9d\x28\x35\xe2\xc8\xfd\x73\xb1\xbe\xf5\x41\x4b\x7b\x66\x79\x6b\x86\x5c\x85\x85\xa7\x02\xf2\xea\x6e\x8d\xe2\x5c\xe0\x57\xc6\x35\x45\x61\x1c\xbb\x2b\xfe\xbb\x27\x9a\xc7\x43\xb8\x97\x99\x29\xc7\x82\xa2\xea\xd2\x98\xef\x7d\xf1\xeb\xde\xab\x21\xf9\xee\xb2\x7f\x2e\x96\x2f\x35\x42\xae\x6e\xb9\x28\x14\xf0\x03\x6f\x28\x3e\x46\xbe\xf6\xc2\x51\x7a\x26\xb4\xda\x34\x95\x99\xde\xab\x51\x55\xfd\x39\x77\x7b\x71\x5a\x42\x5a\x37\x72\x92\xd8\x8f\x5e\xe9\x98\xdd\xcf\x85\x17\x32\x54\xb4\xf7\xed\xad\xef\xe6\xe0\x82\xcb\x8e\x37\x44\x6a\xfb\x7b\xdb\xbd\x35\xd7\xff\xff\x65\x89\x5a\x17\x5c\xa9\x72\x9e\xcf\x6f\x11\x47\x31\xf8\xa0\xe3\x34\x8c\xd3\x0e\xf5\xcb\xc8\xe4\xd5\x12\xa7\xeb\x5f\x78\x99\x71\x75\x9b\xd5\x87\x8e\x16\xaa\x41\xc2\xe5\xfe\xe0\x20\x55\xe8\xe7\xbc\x39\xf6\x27\x76\x15\x4d\x84\xb5\xc4\x2f\xeb\x2a\x2a\xf6\x7f\x5e\x57\x91\xb8\x7f\x82\xb7\x48\xe6\xfe\xd2\xcc\x36\xde\xa2\xe2\xb3\xb8\x0e\xb7\x94\xf5\x75\xa7\xbc\xa7\xd5\xf9\xf6\x1b\xcd\xdd\xef\x85\x03\x89\x5b\xce\x17\x60\x2f\xc7\xd5\x9f\x70\x60\x42\x18\xaf\xc0\xde\xcb\x96\xf7\xaa\xbc\x32\x83\x85\xaa\x30\xf1\x7c\x65\xce\x1d\xd7\x51\xe6\xe6\x74\xea\xdb\x67\x8a\xb3\x66\xe6\xae\xcc\x5c\x99\x9b\x51\xea\x67\x75\x2e\xf2\x91\xd2\x8b\xd4\x95\xdc\x30\xce\xdc\xaa\x46\xfa\x4a\xd9\x79\x51\x70\x9f\xf9\xd3\x90\xf6\x9e\x3b\x0f\xb7\xb6\x57\x6b\xd0\xd1\xd9\xfb\xcb\xb2\x87\x2b\x97\x74\x9f\xb8\xee\xdc\x8f\xbc\xdb\x0f\x52\xcd\x83\xbf\xc7\x25\xf5\xef\x99\x90\xf8\xf1\x97\x98\x7f\x74\x9e\xee\xdb\xbb\xf1\x9f\xef\x33\xf0\x4f\x0b\xfc\x31\x16\xb8\x3c\x75\xc1\xe8\xc5\xa6\xb7\xd3\xf9\xbb\x16\xf8\x4d\x41\xe2\x7f\xae\xe9\x1d\x98\xca\x47\x59\xe0\xd1\x6e\xfc\x7e\xa6\x17\xf8\x51\xa1\x72\x6c\x31\x8f\xb3\x9d\x02\x7b\xeb\x5c\xab\x1d\x47\xa9\x9f\x66\x6e\x64\xe7\x45\xec\x73\x7c\x7f\x4c\xd5\x19\x53\x34\xda\xa5\xb7\x35\x06\xee\xd2\x85\xe5\x0a\xd9\x3c\x8e\xbc\xcb\xd6\x92\xce\x8f\xf8\x5e\x89\x86\xeb\xca\xf5\x32\xe3\x25\x42\xdc\x63\xe8\x65\xac\x75\x84\xc5\x83\x79\xc2\xd1\x74\xea\xce\x77\x16\x03\x8b\x2d\x01\xc7\x14\xc7\x4f\x24\x33\xf2\x5c\xc6\x87\x59\x79\x75\xe3\x66\x61\x07\xc7\x9a\x77\x4d\xe2\x0e\x27\x5b\x77\x24\xf1\xa5\x89\xdd\x3d\x7c\xbd\x6b\x35\xef\xf0\x06\xfe\xa5\x45\xdc\xe1\x0f\x5f\xef\xbe\xde\x35\xb0\xe2\xfb\x57\xf2\xae\x85\xdd\x35\x5b\xc5\x1f\x8f\x0f\x77\xf8\x63\xf3\x8e\xf8\x7a\xf3\xe5\xca\x9f\xfe\xe6\xfe\xb1\x30\x61\xba\xb7\x34\xe1\x3e\x67\x73\xb3\x1e\x75\x73\xe3\xb4\x58\x97\x28\xff\xf9\x72\x75\xf3\x05\x7d\x7b\xbd\xf8\x71\x1b\xf0\xd3\x7d\xe8\x2b\xdf\xa9\x7b\x2e\xad\x60\xdf\x36\xa4\x05\x7c\x65\x80\xf5\xda\xf5\xf7\x3f\xf2\x12\xe7\x0b\x75\xa2\x1c\x0d\xf4\xdd\x9c\x32\x53\xd7\x19\xba\x99\x89\xd4\x44\x9b\xfb\x99\xbb\xe7\xd4\x2e\x42\xed\x7f\x9c\x9d\x96\xfe\xb6\xc5\x98\x8f\x09\xea\xab\xb1\xd6\x11\xd8\xa8\xb0\xa0\xfb\x9c\xb8\x73\xdf\x8d\xca\xa9\x20\x3a\x9e\xbb\x57\xbf\xc9\xe2\xe0\xf7\x1f\xb3\x9a\x40\xde\x62\x8f\x3f\x38\x5e\xdb\x47\xf7\x0f\x08\x91\x6a\x66\xce\x86\x16\x37\x6d\x69\x74\x73\x2c\x4a\x38\xa2\xab\x71\x52\x03\xec\x09\x9a\xd9\x6c\x1e\x2f\xbc\x59\xb2\x28\xee\x37\x6d\x61\xd8\x7b\xa3\x8f\x37\x2d\x96\x22\x59\xa2\xb7\xf8\xd6\x85\xc6\xf4\x0f\xd8\xa9\x7e\xfb\xf9\x46\xaf\x1f\xa7\x91\x7f\xfa\xba\xd6\xfb\xb5\xb5\x9d\xe6\x91\x3d\x2a\x72\x9c\x5e\xb9\xa7\xf8\x3a\x31\xe7\x59\x21\xf6\xbe\x7b\x3a\xee\xa8\x4a\x66\xb3\xf3\x53\xc4\xd7\xf7\xfe\x2b\xb3\x35\x27\xd2\x6f\xae\x76\xc3\xa9\x9e\x99\xce\xde\x78\x65\x77\x89\x84\x4a\x86\x02\xa1\xaf\x58\xf3\x11\xc3\xde\x6a\xa3\xdf\xd1\xd4\xd0\xf7\x83\xce\xf8\x50\xf3\xbb\xb7\xe3\x28\x33\xfd\xe8\x65\x42\xd6\x5f\xc4\x12\xf7\xa4\x71\x89\x59\x9e\xc2\xc0\x77\xb6\xff\xb3\x23\x41\x95\x7e\xf2\x1f\x81\x00\x3f\x99\x5d\x57\xa2\xfd\xb4\xe7\x4f\x7b\x3e\xa2\x63\xdf\xc9\x9e\xab\xdc\xd2\xbf\x8e\x4b\xbf\xc5\x7f\x32\xb3\xaf\x7b\xe0\xd3\xee\x3f\xed\xfe\x88\x92\x7d\x27\xbb\x1f\x25\x6e\x24\xcf\xfc\x69\x46\x97\x19\x6a\x3f\x10\x00\xf6\x28\xfe\x60\x28\x58\x44\xfe\x1f\x0b\xb7\xef\x9e\x9b\x1c\xdd\x2f\x7c\xfe\xad\x2e\x58\x56\xbf\x4c\x3c\x9b\xe2\xf7\xc1\x6b\xd2\xa9\x3f\xaf\x27\xc4\x9c\x59\x33\xff\x0e\x4c\x57\xf9\x8e\x7b\x99\xfc\x9c\xf3\x6a\x47\xd7\x9f\x9f\xef\x55\x7c\x37\xca\x3e\x86\xf9\xd3\x5a\xfe\x4b\x44\xa6\x2f\xc0\xe2\xd3\x57\x7d\xfa\xaa\x23\xda\xf6\x9d\x7c\xd5\x38\x9e\x67\x2f\x72\x9b\xb7\xad\x7c\x46\xa8\xc7\x89\xee\x4f\x0a\x37\x7f\xf0\xa4\x30\xfa\x5e\x76\xdc\x27\x58\x7c\x82\xc5\x11\x15\xfb\x4e\x60\x21\xef\x6c\xf1\xf9\xcf\x18\xd5\xfe\x64\xc1\xc0\x9e\x80\x3f\x6d\xfb\xd3\xb6\x8f\x68\xda\xa9\xad\x98\x1f\x78\xc8\xe6\x05\x7a\xf7\xea\x91\x9f\xdf\xbe\x89\x71\xcb\xff\x0f\xdd\x80\x68\xda\x8e\xf3\x40\x98\x0f\xb7\x8d\xc6\x63\xeb\xb6\xf9\xe8\x4e\x6f\x2d\xa7\x49\xdc\x4e\xbf\x62\x5f\xa7\x96\xf9\x88\x9b\xee\xc3\x85\x1b\x10\xcf\x4b\xfd\x57\xda\x7c\xf8\x21\x8a\x78\xc3\x20\x25\xab\xb2\x05\xf6\xf7\xd3\xfe\x65\x35\xae\xe9\x90\x0f\x16\xf9\x68\xdd\xe2\x4e\x73\x7a\xdb\x7c\x78\x7c\xb8\x35\x09\x12\xbf\xb5\xbf\x3e\x3c\x36\x9a\x0e\x81\x13\xef\xd2\xb8\xe9\x5f\x4a\xe3\x7e\x85\x5d\xe8\x97\xa3\xf0\xe7\xde\xf3\x5f\x7c\xef\xf9\x7f\x16\xf4\xff\xaa\xf9\x39\xdf\x63\x67\xf9\xfb\x01\xe4\x70\xbf\xf9\xf6\xbc\xfa\x0f\xd9\xf1\xfe\x7b\xed\x5d\x3b\x82\x7c\x85\x1a\x78\x3b\x64\x1c\x72\xf8\xe3\x70\xe2\x7b\xcb\xe6\x87\xe2\x88\xe5\x4e\xdd\xa9\x89\xe1\xb7\x84\x49\x90\xb7\x4d\x9c\x7c\xb8\x7d\x6c\x98\x8f\xb7\xc4\x03\x31\x9d\x36\x1a\xb6\xdb\xc0\x9b\x7f\x49\x87\xfe\xa1\x99\xa7\xdf\x4f\x55\x4e\xe1\xcc\xdf\xca\xbf\xff\xfd\xb7\xff\x17\x00\x00\xff\xff\xa7\x4c\x67\x12\x74\xd2\x00\x00")
+var _rpProductionJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x6b\x73\xa3\x48\xb2\x3f\xfc\x7e\x3f\x85\xc3\xcf\x89\xf0\xcc\x73\xda\x36\x20\xab\x6d\x36\xe2\xbc\x00\x24\x10\x48\x42\xe2\x56\x20\xf6\x6c\x6c\x70\x13\x42\x14\x97\x01\x24\x59\x3a\xb1\xdf\xfd\x1f\x05\x42\x37\x4b\x96\xec\x76\xf7\x74\xef\x58\x13\xdb\x2b\x8b\xaa\xac\xac\xac\xcc\x5f\x66\x55\x25\x55\xff\xf7\xb7\xab\xab\xab\xab\xeb\xff\xca\x9d\x89\x17\x59\xd7\x7f\xbf\xba\x9e\x14\x45\x9a\xff\xfd\xfe\xbe\xfa\xe5\x2e\xb2\x62\xcb\xf7\x22\x2f\x2e\xee\xac\xd5\x2c\xf3\xee\x9c\x24\x5a\x3f\xcb\xef\x09\x0c\x6f\xde\x62\xf8\x2d\x86\xdf\xbb\x5e\x0a\x93\x25\x2a\xa7\x7a\x51\x0a\xad\xc2\xbb\x9b\xe6\x49\xfc\xff\x5d\x7f\xa9\x5a\x70\x92\xb8\xf0\xe2\x02\x78\x59\x1e\x24\x31\x6a\x08\xbf\xc3\xd0\x7f\x75\x81\xd4\xca\xac\xc8\x2b\xbc\x2c\xbf\xfe\xfb\x55\xc5\x56\xf9\xbb\xe5\x64\xb2\x97\x27\xb3\xcc\xf1\x78\x77\xef\x51\xf9\xb8\x58\xa6\x1e\xa2\x96\x17\x59\x10\xfb\xd7\x9b\x87\xff\xfe\xb2\x43\xc2\x8d\x82\x98\x4a\x03\xc6\xa2\x67\xb1\x0b\xbd\x6f\xa4\x02\x03\x2f\x2e\x18\x2f\x2b\x98\x24\x8a\x92\x58\xb4\xa2\x77\x52\x74\xe0\x2c\x2f\xbc\x6c\x68\x65\x5e\x5c\xb4\x92\xc8\x0a\xbe\x81\x98\x6b\x15\x96\x6d\xe5\x1e\xe5\x38\xc9\x2c\x2e\xde\x4f\xc8\x8b\x9d\x6c\x99\x16\x41\x12\x53\x45\x27\xc9\x8b\xd3\x54\xec\x24\x81\x27\x68\x3c\x17\x99\xc5\x24\x79\x94\xe4\x2d\x9a\x1f\xe6\x67\x39\xf9\xb2\xff\xd4\xf5\xc6\xd6\x0c\x16\xc0\x82\xb3\xb2\xd4\xf1\x56\xc6\xa9\xe2\x65\xf3\xc0\xf1\x86\x59\x10\x3b\x41\x6a\xc1\xf7\x6a\xc8\x78\x06\x61\xab\xd4\xe0\x33\xbd\x7d\x9d\xcf\xb1\x05\x73\xef\x68\x03\xa1\xb7\x9c\xa3\x92\xc3\xcc\x1b\x07\xcf\xef\x63\x32\x72\x23\x36\x2b\xcd\xc8\xd5\x32\xf8\x5e\x1a\xb9\xcb\x24\xf1\x38\xf0\xb7\x96\xf8\x4e\x32\xed\x78\x1e\x64\x49\x8c\x4c\xfe\x7d\x44\xd2\x24\x2b\x2c\x48\x39\x8e\x97\xe7\x5c\x96\xcc\x52\xde\x3d\xaf\x28\xaf\x50\xaa\x0c\xf3\xbd\x2a\x50\xd1\x68\x43\x6f\x6e\x15\x9e\xfb\x6d\xfc\x64\x29\x1f\x59\xfe\x3b\xed\x2f\x4b\xfb\x89\x7b\xbe\xee\xbb\x2c\x26\x4b\x3f\x06\x6c\xb2\x0f\xb3\xbc\x3c\x9f\x0c\x67\x36\x0c\x9c\xae\xf7\x8a\xed\xbd\x4a\xa1\x48\x32\xcb\xaf\x71\xaf\xea\xd9\x3b\x29\xcd\xec\xdc\xc9\x82\x12\xfb\x6a\x9f\x53\x2a\xc2\xfb\x05\x35\x8f\x94\x60\xf5\xcd\x83\xa9\x14\x56\xec\x5a\x99\xfb\xaf\x16\x91\xff\x6b\xde\x38\xd5\x54\x9e\xbf\x91\xd1\xbf\xed\xd0\xb8\xce\xd6\x3d\x46\x3a\xff\x8f\x4d\x99\x03\x52\x79\x38\x7b\x41\xbf\x7c\x10\x57\x2d\x6f\x58\xbd\xde\x2b\xf2\xef\x83\x0e\xa6\x59\x92\x7a\x59\x11\x78\x2f\x0d\xac\x7a\x5e\xaa\x04\x3f\xa4\x20\x4c\x1c\x0b\x8d\x47\xdf\x2b\x26\x89\xbb\x6e\xa1\x08\x9c\xd7\xe9\xd7\xdc\x64\xe9\x6d\x1a\xa4\x87\xe2\xad\xe5\xd1\x0f\x9c\x2c\xc9\x93\x71\x71\x27\x7a\xc5\x22\xc9\xc2\xfb\x4d\xbb\xae\x9b\x79\x79\xee\xe5\x87\x55\x6b\x76\x50\xf5\x7f\x64\xbb\x3a\xf2\xdb\xef\x77\xf5\xc3\x7f\x1e\xd6\x72\x92\xd8\x0d\x36\xd5\xb6\x91\xce\x6f\x37\x5b\xc7\x73\xf3\xfb\x8b\x6a\x56\x1a\xec\xc4\x4b\x04\x86\x93\xb7\xd8\xe3\x2d\x86\x1f\x1d\xff\x5f\x7b\xa0\x2a\xf4\xfd\x1c\xac\xef\x3a\x58\xe3\x75\xf4\xc0\x0f\xab\x10\x60\x96\x95\x12\xd8\x37\xf8\xdd\xcf\x4b\x1a\x97\xb6\xb5\x5f\x76\x7f\xa0\xce\x56\x28\x2b\x05\xee\xde\xb0\xf1\xee\x6f\x37\x17\xa8\xc0\xcd\x97\xab\x9b\xca\xe8\x5f\x0e\xd1\xd1\x66\x0a\xcb\x47\x0c\xc5\x33\x08\x5f\x2d\xfc\xef\x93\x4f\xff\x7d\xba\x95\x5d\x1c\xaa\x85\x7f\x7d\xb4\xf4\x09\x22\xbf\xe6\x00\x6c\x8d\xf9\xa7\x1a\x84\x35\x5b\x67\x06\xe2\xc5\xaf\xff\x7c\x49\xfa\xda\xb6\x9c\xd0\x8b\xdd\x75\xaf\x87\x49\x02\xdf\x65\x44\x3b\xea\xb1\xa6\xf8\x2d\x4c\xc1\xc4\x72\x69\x0b\x5a\xb1\x13\xc4\xbe\x3c\x83\xde\x77\x37\xec\x13\x80\xf2\x81\xfa\xb5\xed\x93\x97\xe5\xf7\xa7\x00\x6c\x6d\xf5\xd0\x5e\x7f\xa9\xcb\x21\xf5\x7b\x5d\xa1\x5e\x57\xce\x23\xe3\xfc\xdd\xfa\x76\x44\xa5\x0e\xbb\xb5\x2e\xf2\xcd\xbd\x4a\xb3\xc4\x7e\x19\x26\x7e\x54\x47\x4a\xea\x2f\x78\x2f\x7f\xfd\x08\xce\x8b\xc4\x29\x47\xe1\x5a\x75\x0e\x63\x85\x17\xc5\x11\x63\xad\x00\x85\xbd\xf6\xac\xf6\xe8\xad\x2a\xb6\x3e\x57\xb5\x56\xa1\x61\x92\xa1\xe9\xed\xc3\x43\xe3\x32\x55\xd9\x96\xff\x56\x87\x01\xed\x6c\x06\xbd\x3f\xc3\x5d\xfc\x94\x66\x7d\x80\xde\x9f\xa6\x7d\x94\xbb\x1f\x6e\xda\xb5\xaf\x47\x4f\x6e\xcb\xb5\xe3\xbf\x92\x91\x3f\x7c\x44\x40\xf2\x69\xe8\x9f\x86\xfe\xe6\x5e\xfd\xb9\x86\x9e\xe7\x93\x5f\xd7\xcc\x09\xe2\x4d\x56\x4e\x10\x04\xf1\x71\x66\x8e\x44\xf7\x2d\x41\x7e\x35\x32\xdf\x7d\xc6\xbe\x33\x36\x1d\x04\xea\xe7\x44\x9c\x5e\x8a\xa0\xf1\x2c\xb2\xbd\x6c\x30\x1e\xd6\xfd\x38\x37\x18\x99\xf7\xc7\xcc\xcb\x8b\xa1\x55\x4c\x10\x37\xf7\x13\xcf\x82\xc5\x64\x75\x9f\x79\x96\xbb\x3c\xad\x81\x17\x06\x59\x95\x19\xfd\x19\x53\xf2\x77\x4b\xf8\xe1\x17\x92\xf0\xcb\xe8\xe0\xcf\x96\xf5\x05\x48\x93\x6e\xed\xfe\xcd\xa2\xfe\x38\x69\xbd\x05\x27\x2e\x5a\x62\x2d\x91\xfc\xf2\xd5\xd5\x3d\x87\xf0\x73\xae\xac\xbe\xd8\x35\x49\xbd\xd8\xcd\x07\xf1\x51\x74\xfc\x2e\x2b\x59\xdf\xb8\x3e\xf9\xb7\xe3\xa3\xf8\x0d\x0b\xc5\x7b\x52\xad\x36\x9f\x4e\x70\x5e\x04\x5e\xb6\xb7\xb4\x7c\xa4\x8c\x63\xa5\x96\x13\x14\xcb\xeb\xbf\x5f\x35\xbe\x69\xe5\x79\x96\xfa\x99\xe5\x7a\xc3\x04\x06\xce\xcb\x6d\xbe\x4d\xb1\xa8\xda\xf8\xbc\xee\x5b\xf1\xcc\x82\x2f\xd5\xff\x88\x11\x5d\xcf\x83\xac\x98\x59\xb0\x6f\x39\x93\x20\xf6\x86\x59\x32\x0e\x8e\x64\x78\x6c\x8a\x27\xf9\xb9\x22\x55\xcf\x93\x28\x9d\x15\x5e\x26\x5a\x91\xb7\xd9\xb3\xbf\xfe\x87\x93\xc4\x8e\x55\xfc\x86\x86\xf0\xe6\xcb\xd5\xbe\xac\xab\xdd\xb7\x9b\xdf\xbf\x5c\xdd\xdc\xbe\xbe\xee\x59\xa5\x92\x68\xb9\x97\xd5\xc3\xe6\xc0\x64\xe6\xde\xce\x72\x2f\x7b\xad\x1a\x0c\xe2\xd9\xf3\xdb\x22\xf5\x6b\x37\xc8\x2d\x1b\x7a\x43\x2b\xcf\x17\x49\xe6\x52\xb3\x62\xe2\xc5\x45\xb0\x31\xdf\x22\x9b\x79\x67\x50\x0e\x21\xd1\x45\x81\x66\x5a\x6f\xe4\x9e\x8e\x4f\x0e\x3f\xe7\xa9\x6e\xa9\x6f\xfc\x53\x12\x79\xf7\x5b\x89\xdd\xdf\xe5\xf9\xe4\xde\x9a\x15\x93\x24\x0b\x56\x9e\xfb\xaf\x10\x31\x70\x7e\xd5\x79\x43\x38\xf4\x96\x2d\xab\xb0\x5e\x98\xcf\xee\xd6\xf4\xd9\x68\xb7\xfe\x9c\x5e\xa2\xae\x3f\xff\x7c\xef\x12\xf7\x5b\x3c\x67\xbd\x2b\x7e\x91\xb2\x07\x91\xe5\x7b\xb2\x37\xf6\x32\x2f\x76\xce\x4f\x2a\xaa\x71\xce\x27\x15\x7e\xc8\x9e\xdb\xb1\xce\x86\xe0\xc9\x78\xbc\x2e\xde\x69\xf7\xce\x15\xae\x50\xee\xfa\xf1\xb6\x07\xfa\xe7\xca\xce\xb7\x9e\xe1\xf1\x8e\xbc\x23\x30\x02\xc3\x31\x0c\xc7\xbf\xbe\x2f\x70\x49\xf2\x56\x90\x87\xe7\x45\xe0\x64\x9e\x55\x78\x83\xb4\xf6\x66\x6c\x96\x44\x55\xce\xc7\x19\x7e\xab\x7c\x3a\xf7\xa2\x56\xae\xae\x5e\xa4\x37\xa8\x6b\x7f\x3d\xcc\xbc\x28\x98\x45\xff\xea\xc9\xca\x99\x59\xd8\x07\xe9\x53\x5c\x79\xb4\x8b\xf4\xa9\x0a\x20\x87\x17\xcd\x50\x7f\xe4\x0a\xf3\xab\x31\x58\xd5\x12\x1f\x17\x5e\x36\xb6\x1c\xef\xc2\x1d\xd2\xfa\x73\xc1\x40\xee\xc4\x61\xc8\x59\xdc\xc6\x81\x73\xc9\xde\xd8\x1b\x02\xdd\x9d\x3a\x41\x64\x65\xcb\x8b\xe0\x7d\x53\x29\x48\xdf\xd8\xe7\xdd\xcf\xe5\x38\x7e\x75\x4c\x16\x41\xea\x94\x6d\xbf\x01\xb6\xaf\xde\x29\x9c\xbd\xfa\xf9\xcc\x8e\xbd\x97\xe9\x6b\x17\xd7\xbf\x48\x79\xd7\x11\xca\xfa\xcf\xfc\xbe\x6a\xb4\xd6\xdf\x79\xec\x15\xeb\xaf\xd5\x83\x8b\x5d\xcd\xee\xe7\xcc\x62\xcb\x51\xe6\xdf\xa3\x25\xfb\x04\xf6\xa3\xdb\xb7\xaf\x21\x1e\xa5\x7a\xa8\x1b\x69\x90\xfe\x18\x79\xec\x82\x0c\xfd\x86\x0d\xde\x73\x9f\xf7\xc9\xe1\xea\xcf\x5f\x83\x3c\xf5\x39\x1f\xe3\x1c\x7e\x5e\x8f\x79\xde\x4f\xff\xb2\x92\xe7\x5b\x7f\x9d\xce\xe9\xa7\xc7\x29\x9f\x8c\xc9\x3c\x67\x96\x05\xc5\xf2\x22\x27\x7a\x24\x0d\x7b\x3f\x3c\x3d\x2c\x70\x72\x38\x4f\xb1\xe3\x06\x96\x1f\x27\x79\x11\x38\x97\xcd\x89\xec\x24\x29\x5a\xdb\x3a\xe7\x5d\xbb\x17\xa3\xa9\x87\x7b\xe1\x2c\xa3\x8a\x73\xb4\x2c\xd8\x9b\x69\xd5\xaf\x23\x1c\x4c\xb7\x8e\x25\x7d\x96\x53\xaf\xfb\xd7\x23\x80\x37\x09\xc8\x7b\x2e\xbc\x18\x45\x97\x97\x0d\x58\x5d\xfa\xbb\x44\x0b\x4e\x7e\x2e\xb4\xbc\x7a\x77\xb4\xb0\x1b\xce\x6f\xe1\x85\x2a\x5f\xf7\x68\x6f\x7b\x75\x61\x1c\x51\x2f\x29\x31\xb3\xbc\x48\x22\xa5\x4c\xa8\x7d\x4b\xdd\x8e\x15\xbb\xd0\xcb\x76\x97\x7c\x36\x6f\x89\x9c\x25\x60\xcd\x8a\x44\xab\x16\x1b\xfa\x41\x9c\xec\x50\x79\x43\x24\x94\x7b\x45\x11\xc4\x65\x4a\xd2\xff\x5d\xe8\x48\xca\x35\x46\xcf\x29\x3c\x57\xd9\xa9\x7c\xf9\x1c\xb4\xca\x3b\x2e\x35\xdf\xb6\x72\xef\xeb\xc3\x6f\x6b\x03\xa8\xfe\x52\x13\xa5\xcc\xdd\xfd\xed\xc6\x21\x00\xc6\x33\x38\xf4\xa8\xa4\x7b\xf3\xfb\x97\x9b\x7e\xab\xcf\xca\x03\x51\x6d\x8b\x2d\x4d\xee\xfd\xcf\x7f\xad\x2b\x5c\xdd\xba\x57\xff\x3b\xc3\xb0\x86\xb3\xfb\xef\xcd\xcd\xcd\x97\x35\xf9\x5d\x63\xda\x7f\xb1\xe0\xe6\xf7\xdf\xbf\xdc\xdc\xdc\xfc\xfe\xbf\xf1\x0d\x22\xaf\xb4\x98\x81\xc8\xf2\x1c\x68\xcb\x0a\x3f\x10\xdf\xdb\xc2\xc1\x6b\x07\x2f\x1a\x69\x8b\x80\x97\x07\x62\xbf\x2d\xaa\xef\x6f\x62\xe7\x95\x84\xbd\x06\x28\x46\x96\xdb\xca\x40\x93\x99\x36\xdf\x7a\x1f\xf9\xbd\xd7\x90\xf6\x88\x33\x3d\x4d\x51\xdb\xf2\x90\x92\xdb\xa2\xda\x1a\xf4\x29\x5e\x14\xa9\x7e\xfb\x7d\xcd\x9c\x78\x25\x68\xaf\xc1\xe1\x40\x56\xa9\x1e\xc5\x30\x6d\x45\xe1\xe4\x81\x36\xe4\x5b\xca\xfb\x5a\x3b\xf6\x06\xc6\x91\xa6\x98\x1e\xdf\x16\xd5\xf7\x4a\x6e\xff\xe5\x8c\x23\xe4\xdb\xbd\x36\xa0\xd4\x76\xeb\x23\xfa\x72\xf8\xfe\xc6\x5e\x73\xf2\x90\xef\x53\xdc\x3b\x47\x66\xfd\x4e\xc7\x01\xc1\xfe\xa0\xf5\x6e\x7a\xfd\xc4\x3d\x24\xf7\x31\x4a\xf4\xf2\x2d\x8f\x7d\x6b\x68\xf5\x79\x91\x1a\xf2\xd5\xb0\x32\x6d\x59\x65\x06\xfd\xfe\xe0\x1b\x1a\x7c\xed\xd5\xb8\xbd\xa6\x5b\x94\x4a\xd1\x94\xd2\xa6\x18\x66\xa0\x89\xea\xfb\x5b\x3c\xf2\xb6\xdb\x5e\x43\xdd\xf6\x08\x50\x5a\x4f\x1d\xca\x6d\x96\x37\xde\xd7\xc6\xfe\x3b\x5b\xc7\x45\x48\xd1\x9a\xd8\xea\xb5\xff\x07\x91\x38\x2a\x91\xf5\x2b\x87\x37\x65\xe5\x35\xda\xf5\x2b\x35\xbc\xb9\xb9\xf7\xbd\xd8\x9b\x5b\x91\x1b\xfd\x3d\xb2\x90\xdd\xff\xab\x49\xac\x4b\xf5\x06\x0c\xa5\xbe\x09\x6f\x4f\x6d\xc3\xec\xb0\xad\x68\xb4\xc2\xc8\xfc\x10\x11\x7e\x8b\x39\xef\xbe\x18\xf3\xdb\xef\x77\xbb\x7f\xf2\xee\xae\x02\xaf\x41\xb6\xb4\xe4\xb7\x0d\xee\x21\xf7\x28\xfe\xd9\xa1\x8c\xfe\x39\x74\x85\x4c\x0c\x71\x5b\xa1\x0a\x4f\xa1\x71\x87\x93\x27\x2e\xa7\xf9\x3d\xc3\xf7\x01\xc6\xf6\x2d\xbd\x89\x7b\x6d\x36\x36\xf5\x26\xc6\xf8\x69\xee\x46\xe0\xc1\xe5\xc0\xcc\x64\xa8\xc2\x66\xa8\x4c\x54\x29\x28\x43\x81\x95\x15\x6a\x6e\x72\x80\xe8\x35\x84\xb9\xdd\x90\x09\x73\x49\x2e\x6d\x82\xc4\xec\xce\xa8\xeb\x71\xe6\xca\x20\xdc\xa5\xdd\x70\x23\x67\x49\xcd\x8f\xd1\xe9\xab\xd4\x42\xd0\x4c\x45\xd6\x34\xbf\x47\xc8\xd0\x0d\xaa\xfa\x6e\xe4\xcc\xdd\x88\x5d\x1e\xa3\x83\x7e\x67\xfc\x64\xca\x73\x2c\x61\x13\x30\xe4\x19\x01\x3a\xb1\x30\x77\xa6\x89\x6f\x72\x3c\xce\x73\x60\xe9\x44\xe4\xb2\xcb\x60\xab\x7e\x2b\x24\x06\x4a\xe8\x9b\xb1\x30\xb7\x15\x3a\x1c\x45\x60\xe6\x06\xd8\x7f\xdb\x0d\x1a\xda\xd3\xc4\x97\x42\x99\xe9\xb7\xa8\x66\x5f\xa1\xdb\x12\x24\x75\x19\x08\xaa\xa2\x91\x03\x03\xc3\x05\x0d\xc3\x69\xd0\x16\xf9\x41\x40\xb7\x47\x86\x3c\x19\x45\xec\xca\x54\x68\x68\xc7\x66\xea\x44\xe4\xcc\xd6\xc1\xcc\x65\x68\xc2\x34\x84\x95\xa5\x93\x33\x9e\xc3\x53\x87\xc0\x27\x2e\x27\x26\xbc\x9f\x2e\x91\x6c\xcd\xa0\xe2\xb7\x47\x3c\xa7\xa3\x80\x5c\x3a\x1c\x36\x37\x70\x32\x1c\x05\x49\x97\x89\x85\x05\x2a\xd3\xd3\x61\xe1\x70\xe4\xd2\x65\xe8\xc4\xed\xc8\x0b\x67\x95\xcc\x7b\x84\x9c\xf7\x22\x13\x9a\x1c\xb9\x1c\x19\xf4\xd2\x26\x52\x38\x6a\x48\x33\xbb\x21\xc4\xbd\x06\x8d\x8f\x02\x12\x3a\x1c\xc8\x7b\xb8\x20\xa9\x0a\xde\xd1\xda\x4e\xa1\x60\xc0\xec\x69\x40\x92\xb5\x45\x21\x2e\x52\xd4\x96\xdf\x53\xf0\xd4\x36\xe8\xb9\x13\x4b\xbe\xd5\x91\x31\xa7\xd3\xff\xda\x5b\x92\x8b\x91\x2e\x66\x23\xdd\x85\xce\xb2\x59\x58\xba\xb8\xb4\x1b\xe2\xdc\x8c\xa5\xd9\x88\x20\x8b\x1e\x51\x40\xcf\xe8\xcf\x6d\x1d\x4e\x9d\x88\x5c\xd9\x84\x89\xf5\x22\x76\x35\xba\x9c\x66\x64\x77\x00\xb4\x63\x39\xb0\x0c\x69\x66\xe9\x4f\x73\x33\x7a\xc6\x91\x2e\x8d\x22\x88\xf5\xa2\x02\x7a\x52\xd2\x35\x23\x72\xc9\x73\x2c\xe6\x72\xa0\x70\x3a\x92\x6f\xe9\x0f\xbe\xb7\x6a\xcf\x7a\x53\x40\x0e\x96\x74\x68\x2f\x12\x9f\xef\x6c\x74\x34\xb5\x63\x11\x1b\xe9\xcf\x39\xcf\x4d\x30\xb7\x43\xaf\x06\xc1\xd3\xdc\xe4\x16\x33\x33\x02\xa1\xdd\x10\x26\x4e\x47\x98\x5b\x11\x98\xba\x4c\x73\xee\x44\xce\xdc\xe9\x80\xa0\x47\x80\x85\xa9\x2f\xe6\xa6\x41\x43\x9b\xc1\x97\xa6\xfe\x0c\x47\x86\x08\x7b\xfa\xf3\xc4\xe5\xc0\xca\x65\xb0\x46\x2f\x6a\xce\x47\x86\x30\xb5\x98\x66\xd9\x3f\x21\x18\xf9\xa3\x58\x80\x23\x3d\xef\xf2\x0c\x9d\x9a\x01\x6d\xeb\x4b\x2a\xf4\x88\x9a\x57\x99\xe4\x19\x3c\x77\x19\x0a\xe7\x59\xdc\x1d\x2c\x69\xcc\xe2\xc0\x8c\xef\x88\xb9\xa9\x83\x05\xdf\x6a\x2f\x06\x4b\x1a\xda\x1d\x11\xf2\x1c\x78\xb0\x0c\xc9\xef\xab\xb9\x6f\x46\x61\xd7\xe4\xc8\x99\x29\x25\xdd\x11\xc1\x62\x7c\xeb\x61\x6e\x1a\xf2\xb4\xd7\x40\x7d\x6c\x2e\x4d\x24\xd3\x65\x33\xec\x11\xec\x57\xd7\x10\x60\x2f\x16\xa0\xc3\x3d\xf9\xc3\xd6\x22\x96\x35\x92\x13\x16\xa9\x3d\x32\x52\xdc\x89\xb4\x62\x44\x3c\xa7\x86\x94\xce\x46\x3a\x0e\x87\xfa\xba\xbc\x2e\xe6\x96\x94\x06\xa8\x7f\xae\x21\xe4\x43\x7d\x2b\x27\x87\x63\xa7\x16\xc1\xc6\xa6\xd1\x9f\xed\x8f\xab\x38\xb7\x15\xb2\xe9\xea\xf8\xba\x7d\x72\xe2\xc5\x60\x69\x2a\xf8\xd4\xe6\xc2\xae\xa9\x37\x27\xa3\xe8\x19\x9a\x2d\xbc\x69\x1a\xfd\xae\xd9\xa0\xe3\x11\x31\x81\x23\x22\x27\x3d\x1d\xac\x18\xbf\xe6\x09\x4c\xed\x86\x00\x0f\x79\x1a\x11\xe4\xd2\xfc\x28\x9e\x74\x71\xee\x44\xda\xab\x3c\xd9\xd1\x53\x17\xc9\x8a\xf1\xd3\xe9\xc8\x90\xfc\x61\x40\x42\x97\xeb\xcf\x3d\x03\x14\x95\x3c\xc9\x55\x2f\x92\xe6\x2e\x27\x15\x48\x57\xed\x58\x2a\x4a\x9d\x3c\x22\xeb\xc3\x32\x9b\xbe\x19\x72\xd8\xd3\x2b\x6c\xec\xe9\x42\xea\x52\xe7\xfb\xb7\xaf\xff\x70\xde\x23\x44\x64\x1f\x73\x67\xf9\xd4\x60\x22\x30\x1b\xe9\x42\x6e\xea\x52\x25\xd3\xc8\x5d\x98\x84\x98\x98\xba\x98\x0d\x0d\x08\x9d\x45\xca\xaa\xd8\xa8\xcb\x44\xe6\xdc\x09\xe8\x89\xdb\x91\xa1\x6d\xd0\x18\xcf\xc1\x19\xdf\xc9\x9f\x7b\xc1\x03\x3e\x46\xfa\xc5\x3d\x75\x51\x3f\x79\x06\x2b\x6a\x19\x39\x11\x58\xd8\x2b\x7c\x69\x75\x40\xda\x33\x84\xc4\xd4\x17\x85\xb8\xc4\x57\xa6\x21\x10\xa6\xc1\x17\x4e\x34\xc1\x2d\x05\x9f\x3b\x1d\x39\xb5\x89\xe6\x04\xd9\x88\xc3\xe1\x2b\x9e\xc1\x9b\x88\xbe\xd3\x90\x27\x36\xb7\xf0\x47\x46\xba\x32\xf5\x3e\xd2\xbb\x89\xad\xb3\x04\xcf\xb1\x5f\x1d\x02\x4c\x7b\x3a\x3e\xb7\x23\x88\xd9\x0d\xde\xdf\xd5\xcd\x9e\xca\xcf\xfa\x2a\x35\xeb\x2b\x74\xad\x4f\x85\xd9\x11\x43\x54\xaf\xd4\x55\x43\x84\xa3\x06\x58\x5a\x86\xdc\xe4\x39\x79\x3e\x22\x0a\xe8\x04\xf4\xdc\xe1\xc0\xcc\x69\x88\x79\xcf\xa0\xa1\x13\x2d\xfc\xc3\x31\xe0\x99\x51\xc4\x73\xc2\xd2\xd4\xd9\x8c\x09\x28\xdf\xd2\x47\xbe\x8e\xe7\xbe\xd0\x29\x36\x72\x19\x2b\x54\x61\x77\x24\x5f\x54\x68\xd7\x50\x73\xdf\xe5\x26\xd0\x0e\xe8\x95\xcd\x01\xe8\x30\xd4\x73\xbf\x95\xfb\xa6\xfe\x5c\x62\xb9\xc7\x41\x8c\x6f\xb5\x1f\x79\xce\x4c\x99\x48\x9e\xdb\x91\xb6\xc1\x65\x53\xa1\xc2\x6e\xa7\xfa\xee\xe8\x6d\x7f\xcc\xd0\x31\x92\x27\xcf\x36\x27\xa3\x58\xc0\x7a\x4a\x78\x60\xc7\x62\xd3\x21\x44\xcc\x66\x9a\x61\x6f\x45\x3d\xf7\x74\x39\x75\x08\x36\xb0\x39\x24\x13\x72\x69\x2a\xcd\xa9\x4d\x34\x23\xbe\xb5\x78\x12\x30\x30\x94\x03\xa7\x6b\x11\x60\x69\x47\x20\x47\x3a\xef\x44\x60\xec\x54\x78\xb8\xb4\x03\x8a\xe4\x3b\x8b\xf9\x28\x82\xb3\x5e\x43\x5e\xba\xba\x56\xe9\x75\x5c\xb7\x41\x15\x3d\x43\x6c\x3a\x0d\x19\xda\x25\x96\xc2\xa5\x69\xb8\x68\xac\x8a\x11\x81\x87\x48\x07\x46\xba\x1c\xf6\x2a\x9c\x26\xc5\x96\xb4\xea\x35\xe4\xa9\x53\xd6\x43\xb2\xc5\x27\x36\xf2\x85\x54\x1a\x59\x86\x00\x5d\x82\xcd\x6d\x06\x9f\xda\xba\x84\xf0\x7d\x62\x72\x52\xe5\x93\x5a\x18\x26\xb6\x90\xbd\x88\x0b\x44\xd3\x41\xbc\xe9\xec\xac\x8c\x0b\x22\xe4\x07\x41\x03\x61\x72\x4f\x17\x0b\xe4\xd3\x7b\x3a\x1b\x9a\x0c\xbe\xb0\x1b\x02\x36\x54\xf9\x65\x7f\xca\x1f\xaf\x7b\x60\x9f\x2f\xec\xb1\x71\x60\x63\xcc\x4b\xd9\xe9\x18\x1c\x68\x2c\xd0\x0c\x29\x11\xd4\x88\x2d\x4c\x85\x5e\x79\x86\x88\x99\x3a\x1e\x32\x3e\xd4\x46\xba\xe3\x5b\x11\x89\x3b\x51\x73\x62\x73\x52\x97\x01\x6b\x79\xe9\xf2\x58\x8e\x60\x8e\xe4\xcc\xb3\x64\x4b\xc5\x70\x71\xa8\xb3\x4b\x7b\x91\x74\x75\xcc\x14\x54\x56\x66\x35\x88\x75\x19\xad\x39\xb1\x75\xcd\xb7\x75\x32\xb4\x74\xb3\xc9\xf8\x50\x1c\x19\xf2\xd4\x62\xe8\x3f\xec\x06\x1a\x37\x36\x37\xa9\x44\xd0\x22\x50\xd8\x0d\x13\x1a\x0d\x37\xb5\x39\x79\x3a\x32\x84\x90\x67\x9f\xba\x0c\x10\xa0\xad\x93\x84\xa9\xd0\x9a\xa2\xe1\xac\x86\xcb\xb4\x0a\xa8\x2e\x03\x0b\x4e\xd1\x9e\x35\x19\x08\x2e\xe3\xc3\x01\xc2\x14\xbe\x23\x40\xb7\x21\xa4\x2e\x07\xc6\x2e\xc7\xc6\x27\xdb\x8a\x41\x8e\xf4\x52\x6d\x93\x1d\x05\x83\x03\x19\xf9\xa7\x78\x32\x71\x75\x39\x75\xf7\xbf\x47\x23\xa4\xe3\x12\xea\x13\x09\x00\x4b\x03\xc0\x6e\xfb\x84\x7c\xaf\x4b\xb0\xcb\x92\x66\x19\x7b\x50\xcb\x81\xca\xaf\xfa\x54\x8d\x35\xec\x57\x9e\x7b\x9e\x9b\x04\x9c\xf1\x0c\x9e\x56\x7f\xb3\xd3\x11\x41\xe2\x76\x2c\xf9\xeb\x65\x94\x15\xcf\xf0\xa1\x86\x03\x46\xc3\x44\x45\x01\xa8\x9f\xe4\x40\xd1\xa4\x80\xf1\xd3\x7a\x2c\xa6\x2e\xb7\xf0\x11\x8e\xa0\x78\xc1\xe4\xc8\x29\xd2\xf9\x5e\x2c\x42\x27\x36\xd3\x11\xa1\x75\x47\x46\xe2\x8f\x74\x71\xb9\x6d\x0f\x2b\xec\x72\x3c\xa9\x40\x60\x26\x2b\x13\xe9\xa4\xae\xf9\x42\x43\x7c\xea\x05\xc9\x7c\xdc\x59\xc4\x48\x0f\x86\x0c\x1f\x4a\x9a\xa8\x68\x21\x50\x55\x1c\x28\x12\x06\x04\x99\xe1\x53\xde\x4f\xba\xaa\x26\x8b\x8a\x86\xd3\x32\xa6\x91\x7c\x20\x3f\x6a\x90\x16\x54\x8d\xed\xc8\x8a\x06\x7b\xcb\x94\xec\x2d\xe5\xc7\x9d\x32\x53\x7e\x99\xcc\xc7\x0a\xdf\xad\xf9\xe3\x3b\x34\x8e\x70\x8f\x0f\x64\x51\x6e\xe3\xeb\xba\x47\x9f\x2b\x5a\x1b\x8a\x92\xe6\xb2\xa8\x5d\xd4\x17\x9b\x23\x63\xbb\x01\x90\x8e\x17\x16\x21\xa7\x4e\x40\x55\xf8\x40\xb0\x4b\x7b\x89\x2f\x9d\xb5\xbf\x10\xa7\xa8\x5f\x12\xf2\x39\x4f\x7c\x20\xd3\x65\x3b\x21\x2b\x29\x9a\x48\x4b\x10\x0c\xe4\xf6\x33\xcb\x07\xd4\x7f\xf7\x08\x80\x8d\x96\xe4\xc4\x89\x9e\x0a\x27\xa6\xe6\x23\x5d\x2e\x2c\xfd\xa1\x18\x11\xed\x62\x14\x83\x99\xc9\x3d\xc3\x5e\x4c\x43\x5b\x4a\xa7\x16\x47\x36\xec\x80\x2a\xb4\x00\xe1\x1c\xb5\x18\x4c\xdb\x8b\x7e\x8b\xf2\x0f\x68\x74\x99\x48\x9c\xb8\xcc\x86\x36\x1a\xab\xd2\xbe\x2c\xdd\x99\xdb\xba\x5c\x20\xf9\x96\x78\x13\xe2\x6d\x55\x33\x15\x15\x6b\x6a\xb2\xd6\x6c\x03\x20\xf4\x87\x8a\x13\x22\xd9\xc9\x50\x18\xaa\x50\x66\xd5\x50\x06\x5a\xb8\x88\xab\xb2\x95\x2c\xea\x32\x6b\xf9\x56\xcf\x80\x38\x04\x40\x68\xc9\x1a\x18\x80\x10\x22\x9a\xa2\xac\x35\xb5\xb2\x6c\x9b\x6c\x49\x40\x16\x54\xec\x61\xbf\x2c\x10\x86\x6a\x5b\x23\x11\xcf\x88\x9e\x86\x91\x40\x0b\x45\x56\x0b\xc9\xbe\xac\xc1\x41\x69\x53\xa1\x58\xb6\xd7\xe5\x26\x73\xa7\x21\x97\x3e\xba\xab\x38\x75\x1c\xb0\x19\x83\x2a\x0e\x07\x98\xbb\xd8\xc7\x1e\xa7\x01\x57\x28\xae\x33\x19\x72\xad\xb3\x58\x29\x83\x1d\x1d\xdd\x8b\x0b\x80\xde\x4c\x5d\x16\xeb\x4a\xba\x89\x99\x06\x4f\x1e\xd3\x69\x2d\x02\xcf\xae\x8e\x30\xb9\x7f\xf4\x39\x03\x0b\x15\xf9\x60\x4b\x17\x51\xcc\xc4\xee\xcd\x29\xda\x66\x6a\x73\x1a\x79\x6a\x6c\x98\x10\x3c\x98\xba\xa8\xba\x1c\xbb\x74\x59\x7a\x69\xaa\x58\xd1\x6b\x80\x95\x13\x90\x81\xa5\x3f\xcc\xb7\x3a\x2a\x14\x3c\x83\x47\x3c\x03\x06\x7b\x75\x5a\xd8\xdc\x35\xc4\x65\x8f\x10\x52\x3b\x20\x43\x9b\x10\x33\xd3\xe0\x7d\x27\x06\x33\x9e\x5d\x74\xf9\x12\xc7\xc1\xcc\xed\x08\x4d\x87\x23\x53\x64\xef\x6b\xfa\xab\xd2\x1f\x61\x38\x74\x3b\x42\x3a\x6a\x88\xac\x87\x7c\x6e\x2c\xa6\x36\xf1\xe0\x1b\x54\xe2\x23\xdb\xb5\x38\x72\xe5\x72\x15\xce\x08\x9a\xbf\xf9\x7d\x6d\xd3\x50\x0d\x68\x07\xf9\xee\x9e\x82\x2f\x6d\x65\xfd\x5d\xc7\xfc\x7e\xe4\xac\xcb\xe2\x04\xcf\x54\x63\x53\x8d\x03\x0d\x6d\x35\x59\xdb\x10\x1e\xda\x4a\x73\x61\xea\xd8\x6e\x59\x62\x64\xf0\xe8\x79\x63\x10\xec\x7c\x8f\x93\x75\x99\x5d\x1b\x5e\xb7\xa7\xa1\xb1\x90\x39\x4b\x7f\x86\x2f\xda\xda\x94\x31\x97\x36\xd1\xc4\x64\xbd\x19\x02\x43\xc8\xd7\x74\x38\x2d\x24\x07\xa0\x0d\x06\x32\x0b\x14\x95\xa9\xcb\x22\xec\x72\x51\x0c\xd3\xb2\x89\xe6\xca\x26\x9e\x61\x2d\x4b\x95\x23\x63\x95\x03\x84\xa9\x2f\x7c\x80\x30\x20\x82\x33\x73\xb9\xae\x07\xe8\xa5\x65\x98\x68\x2e\xd2\x33\x0d\xf8\x3a\x3f\x40\x9c\xbb\x86\x30\x35\x35\x30\x73\x23\x88\x78\x43\x71\x1e\xb6\xe6\xab\xc6\x40\x56\x85\xa6\x80\x78\x54\x91\x9d\x31\x07\x75\x81\x30\xb7\x39\xcd\x17\xda\x2f\x6c\xac\x96\xa7\x8a\xfc\xcd\x88\x00\x0a\xea\x83\xa2\x37\x57\x2e\xc7\xce\x90\x0d\xbc\xac\x03\x04\x15\x8a\x9a\xa4\x35\x5b\xb2\x94\xb2\x1e\x07\xa6\x5a\x43\x9e\x3b\xa7\xf4\x0b\x3d\x63\x28\xa8\xfa\xa9\x62\x1a\x22\x36\x32\x04\x6c\xa8\xb3\xb9\x4b\xb0\x4d\x67\xb1\xfd\x4d\x23\xc0\x74\xa8\xb6\xbb\x5a\xe9\x33\xe4\xbe\xa5\xe3\xa9\xdb\x86\x33\xe4\xaf\xdd\x88\xcd\x87\x6a\xe9\x43\x85\x7a\x3e\x68\x48\xa9\x31\xd2\x9b\x98\xa9\xcb\x8c\xa7\xe2\x85\xab\x3f\x63\x96\x82\xe3\x4e\x69\x73\xf2\xc4\x89\x5c\xe8\x6e\xfc\xda\x69\xdc\x1b\x19\xc2\xbc\x67\x08\x8b\x2d\xf6\xb1\x2d\x0d\x92\x8a\xbc\xe9\x33\x29\xc8\x2d\x2c\x16\xda\xe8\x77\x81\xad\xb1\x48\xd1\xa4\x98\x09\x59\x84\x7d\x03\x03\x63\x25\x05\x90\x2d\xb5\x0d\x59\x15\xca\x63\x09\x03\x0a\x58\xc7\x18\x2a\xd6\x1c\xab\x21\x2b\xca\x6a\x49\xa3\x2c\x2f\x01\x5a\x90\xb0\x67\x01\xe1\x60\x59\xb6\x2d\x0e\x55\x0d\x1f\xaa\x61\x93\x56\x35\x84\x9b\x32\x0d\xda\x2c\x23\x01\x91\x35\x30\xb6\x25\x61\x24\x40\x74\xb7\x74\xb6\xcf\x25\x4d\x6c\xa9\x38\x18\x80\xf6\xa6\xee\x50\xd5\x58\x41\x85\xe4\x40\xd2\x70\xf6\x00\x67\x67\x42\x5b\xec\x03\x20\xa2\x38\x44\x92\x80\x80\xf8\x6d\xab\x18\x4e\x2b\x5a\xb3\x2c\x2f\x2c\xd2\x9e\x0c\xa0\x2e\x01\xd0\x07\x2c\x29\x69\x21\xe0\x14\xe0\x93\xc2\x52\xde\xf9\x9d\x56\x64\xcd\x14\x74\xc6\x29\xf1\x79\xcb\xa3\x44\x4a\xd5\xbc\x50\x31\x75\x99\x1f\x19\xf2\x10\xc5\xf6\x1a\x31\x49\xcd\x58\x56\x34\x2a\x45\x3a\x5b\xf5\x03\x88\x92\xa4\x89\xec\x10\x08\x12\x03\x05\xc9\xc0\xf0\xa1\xdc\xd6\x50\x3b\x8a\xd6\x2e\xbf\xc7\xe8\xf7\xda\x9f\x57\xbf\x57\x7e\x46\x58\x9c\x1c\xd7\x32\x0e\x2c\x63\x72\x14\xf3\x29\x1b\xdf\x37\x43\x7a\xe1\x46\x70\x6a\x2a\xd4\xd3\x90\x71\x51\xfd\x98\x81\x05\xb0\xab\x39\x1e\x6d\xc6\x32\x74\xa6\x78\xad\xb7\xdb\xf2\x12\xd2\x51\x16\x47\xf1\xb2\xb3\x3a\xf6\x3c\xe9\xea\x78\x8d\xf1\xc0\x65\xc2\x7d\x3b\x45\x31\xa7\xa9\x62\xbb\x73\x85\xb9\x1d\x99\xa9\xb9\xe3\x97\x65\x63\x02\x47\xf8\xda\x0e\x3a\x02\x1c\x2a\x27\x6c\x29\xc2\xfc\x9e\x3e\xf2\x05\xed\x61\xaf\xce\x50\x21\x71\xa7\xc1\x57\xf3\x06\x62\x33\xaf\x5a\xba\xfa\xb7\xe2\xb3\xe6\xa3\x58\xcb\xc0\xb7\x7a\x6f\x60\xb0\x5d\x63\x9c\xa9\xd0\x55\xfc\x02\x49\x5a\x6b\xc3\x71\xad\xd3\x06\x26\xb2\x5a\x69\x07\xa4\xa8\x96\xeb\x6a\xa5\x6e\xd6\x58\x03\xf9\xf6\x2b\xfa\xbd\xd3\xb6\xdc\x26\x45\xa9\xb4\xaf\xc3\xfa\x05\xab\x03\x93\x06\xda\xb3\x66\xe0\xb5\x2e\x6e\xeb\x1d\xe8\xe4\x4e\x3d\x84\x65\x95\x5d\x68\x38\x4d\x4b\xd8\x0e\x4d\x76\xa3\x83\xf5\x6f\x05\xdf\x12\xe2\xba\xaf\x0e\x43\x61\x62\xab\xff\x75\xd0\x92\xb0\x7e\x8d\xe3\xc6\xe8\x30\xc6\xfa\x7a\xf0\xf7\xae\xbf\x42\xe3\xb1\x1b\x77\x6c\x62\xfc\x41\x70\xfa\x59\xdd\xbe\xbb\x1b\xcb\xac\x92\x9d\xef\xe9\xd7\x75\x99\x70\x1b\xef\x56\xfc\xed\xea\x96\xdd\xa0\xc8\xe3\xf1\x42\xf9\xcc\xef\x19\x92\xdf\x5f\x8d\x16\xfd\x0a\xab\x35\x4b\xc7\x21\x8a\x67\x4b\x6c\x67\x45\x38\x5a\x61\x2b\x71\x4a\x2d\x18\x28\xc0\x75\x5c\x4f\x8e\xf4\xe7\xc6\xc8\x80\xab\xed\x6f\xb2\x6a\xea\x7d\xb2\x2f\xa5\x55\xcc\xd1\x7e\x4e\x6d\x1d\x62\x0a\xc2\x69\x43\x20\x46\xfa\x82\xec\x53\x68\x6e\x52\xaf\x31\x3c\xbb\x0c\x74\x27\x76\x2c\x43\xb3\x2d\x34\x87\x3a\x8e\xdb\x1d\x39\xed\x19\x60\x85\x6c\x0c\xd1\x30\x09\x80\x31\x21\x18\xca\xfe\xe1\xfa\xd9\x4b\x5b\xb2\x75\x72\x66\x19\xf2\xdc\x09\xa8\xa7\x61\x1b\xd5\x49\x5b\x2a\x0b\x54\xd0\x06\x8a\x81\x95\x63\x4f\x4b\x98\x38\x04\x28\xfe\xd4\xaa\x35\x09\x2d\x02\xa1\xc2\xb1\x98\xda\xa0\xa1\x0d\xc5\xc4\xd2\x4d\x4c\x22\x9e\x71\x84\x1f\xce\xcb\xfa\xbb\xba\x43\x4a\xa1\x20\x7e\x1b\x56\x1f\xd1\xe3\xd2\xd7\x6c\x7f\xd7\x58\x81\x95\x43\x38\x12\x16\x15\x76\x6e\x68\xb4\x70\xba\x5c\x63\x01\x02\x34\xdb\x93\x89\xdb\x26\x17\xa6\xde\x54\x2d\x0e\x46\x2e\x2b\x48\x55\x3c\x7d\x84\xdf\xef\x8c\xb5\xdb\x31\x68\xae\xea\x58\x77\x6f\xfe\x8e\x03\xf4\xdc\x65\x42\x36\x42\xbe\x7d\xa8\xd7\x78\xb5\x2d\x5f\xea\x93\x01\x52\x27\x02\xab\xa3\xcf\xfd\xd4\xd6\x6a\xfc\x05\x58\x57\xd6\x9b\x84\x65\x08\x73\x3b\xc2\xa1\xbd\x8e\xef\x86\xca\x36\xce\x1f\x11\xe4\xcc\x8c\x60\xbc\x9e\x8b\x15\x36\xd1\x4c\x5d\x8e\x5c\xfe\x98\x98\x7a\x3b\x3f\xe1\x19\xc0\x6f\x7f\xaf\xb1\x78\x8b\xd1\x08\xdf\xb7\x58\xb5\xf1\xd3\xe3\xd3\x78\x76\x58\x06\xe9\x15\x50\xb5\x36\xdb\xda\xc7\x51\x56\x93\x34\x81\xd6\x30\xb0\xd5\x1f\xb6\xd2\x8d\x1d\x2c\x3f\xe6\xf7\x0f\xb1\x73\x63\x3f\x3b\xf5\x5e\xf8\xf4\x9d\x67\x8a\xc6\x92\xa2\x8a\xc9\x9b\xdf\x6c\x85\x5a\x9a\xbb\xf8\xd9\x10\x70\x3b\xd8\xd1\x27\x22\x45\x31\xeb\x6c\xa4\x2f\xbe\xbe\xf2\xec\x2d\xf3\x80\xed\x5c\xbd\xe4\x81\xde\x8e\xff\x4f\x8c\x65\xe5\x3a\x1c\xc7\xe6\x3b\x71\xa9\x05\x80\xc0\x1a\x38\x3d\xd4\xa0\x4c\xab\x6c\x39\x16\xac\x86\x8b\x63\x19\x17\x86\x00\xd0\x63\x45\x93\x55\x14\xef\x69\x6d\x52\x01\x6d\xb6\x8f\xc6\x5a\x06\xa2\xba\x7e\x2e\xc8\x6c\x3f\x3e\x42\x67\x13\xb7\x2a\x9a\x84\x6c\x5f\x52\x71\x41\x93\xb4\xe7\xfa\x77\x41\x66\x9c\xae\x04\x52\xa0\x85\x60\x5c\xd3\x36\x30\xd0\x97\x11\x46\xb5\x41\xdb\xc0\x5c\x45\xc5\x81\x84\x62\x03\x6d\x85\xc5\x02\xbb\xa6\xdd\xde\x96\xd9\xe7\xe1\xd7\xc1\x4c\x6d\x3d\x0e\x0c\xdc\xc8\x8b\x57\x71\x51\xdb\xf2\xfa\x3c\x94\x30\xb6\x5c\x03\xeb\x45\x6c\x68\xeb\x70\xd6\x0b\x64\x45\x63\x69\x5a\x0b\x11\xdf\xeb\x78\xbc\x8e\xed\xbf\x77\xac\xbb\xe6\xf7\x7b\xae\x63\x9c\x99\xa3\xbd\x6b\x8d\xa3\x9a\x87\xd1\x73\x27\x96\x27\x36\xb5\x99\x57\xa2\x76\x24\x27\xd2\xc8\xde\x89\x18\x77\xbd\xdf\x8a\x62\x96\x9d\x3a\xd2\x89\x58\x07\xe1\xc9\x26\xce\x4d\xec\x86\x88\xd5\xf1\xaf\xc2\x6c\x7e\xaf\xb1\x7a\xb0\xc1\x6a\x43\x28\xbe\x3d\xe6\xbd\xcc\x7e\x77\xdb\xd1\x21\x50\x64\x40\xd6\xf6\xb8\xd3\xd6\x7e\x0c\x7e\x58\x4e\xd6\x9e\x59\x10\xb2\x9a\xac\xc9\xa7\x68\xb7\x25\x20\xd3\x52\xc8\xaa\xf2\x0e\xa6\xff\x98\x38\xfb\x88\x1d\xed\xf8\x2a\x0d\xd2\x63\x55\x23\xdb\xf2\xf1\x35\xa2\x05\xdf\x92\x30\xb1\x95\x3c\x88\x2d\x09\xdb\x89\xcd\x97\xfd\x29\xbf\x1c\x4c\xcb\xbd\x87\x3f\x37\xe6\xde\xe0\xc5\x25\xbe\xe5\x5b\xfc\xc7\x64\x6a\x13\x0f\x7e\x0f\xf0\x7e\xdd\x07\xa3\xa1\x7d\xb5\x09\xe1\x0f\x53\x17\x31\xa3\xc1\x7f\x45\xfc\x1a\xc4\xf3\xdc\xc4\x49\x6c\x10\xf7\x17\xb5\xaf\xb4\x1b\x34\xd6\x23\xf0\x74\xd4\x10\xe6\x0e\x41\x46\x2e\x43\xe6\x65\xee\x07\x87\xcf\xed\x68\x93\xff\x51\xaf\xa1\x22\xf9\xee\xe6\x33\x34\x46\xf5\x1e\x0d\xb6\x4b\xa3\x59\x61\xab\xd2\xec\x99\x06\xd4\x47\x06\xc8\x5d\xa6\xa9\x22\x3f\x6b\xd6\xfb\xfe\x1d\x73\xe2\x04\x74\x6a\x07\x54\x60\xeb\xf2\xca\x64\x78\x9f\x8f\xf0\xd0\x56\xf8\x47\x9e\x93\xe7\x17\x60\x5c\x68\x37\xdc\x99\xcd\x91\x13\x93\xc1\xc2\x92\x27\x5d\x5c\x9a\xba\x8c\xe2\xbe\x74\xa4\x3f\xaf\xf6\x71\xef\xb9\xc4\xce\x6d\xcc\x29\x43\x87\x10\x97\x96\x41\x63\x96\x4e\xce\x86\x80\x86\x4e\x04\xe7\x26\x07\xa7\x3c\x23\x23\xd9\xf8\xa3\x86\x00\x4d\x0e\xcc\x5c\x0e\x4e\xec\x4e\xdf\x77\x22\x10\xa1\x38\xd4\xa2\x0e\xe6\xf9\x50\x6e\x3a\x9c\x46\xda\x44\x13\x3a\xc4\x64\xee\x52\x47\xf1\x27\xb7\x09\x71\x62\x33\x1b\x1c\x6a\xd8\xd1\xf3\x7c\xa4\x4b\xc5\x41\x3b\x33\x87\xf0\x7d\x01\xc9\xc7\xbf\x18\xef\x2f\x90\x85\x9c\xda\x3a\x58\x6e\x62\x88\xed\x7a\x47\xdb\x34\xc4\xa9\x13\xc1\x85\xcb\xc1\xb9\x3d\xc5\x25\xd3\x10\x52\x9b\x90\xd3\xd1\x92\x2a\x69\xf1\xdc\x3e\x2d\xbe\x23\x40\x33\x16\xa0\x43\xf8\x08\xe3\xcb\xf9\xa1\x03\xb1\xae\x4a\x34\x19\x9b\x20\xd7\xeb\x77\x74\x61\xe9\x0f\xe8\xb7\xd6\x48\x7f\x86\x76\x24\x4f\x9c\x29\xb6\xe8\xad\xda\xcb\xc1\x94\x5a\xa0\xff\x31\x21\x3b\x1d\x35\xc0\x72\xa4\x8b\xcd\xaa\x4e\x95\x4f\xb0\x5e\x73\xcc\x6d\x16\xeb\x02\x82\x45\x3e\x25\x94\xe2\x90\x74\x39\x58\x98\x86\xb0\x3a\x5c\xd3\x3b\xcc\xa9\xa8\xe2\xf0\xe7\xf9\x88\x60\xf3\x4d\x3c\xbe\x91\x0f\x3e\x75\x22\x10\x22\x9d\xb5\x74\x36\x77\x96\xcd\x95\xc5\xd4\x73\xc4\x64\xca\x2b\xd5\xf8\x8c\x22\x76\x65\x51\xe9\xca\x34\x24\xbf\xa7\x03\x9c\x41\xf3\x3f\x0c\x97\x54\xac\xc9\xaa\x50\x22\x79\xb8\x08\xfb\x0a\xdf\x35\x75\x31\xb1\x97\x54\x20\x6f\xc7\xd3\x37\x18\x79\xb7\xec\xa1\x1e\x05\x8c\x9f\x6a\xb2\x86\x4b\x06\x26\x0b\xda\x14\x77\x04\x66\x52\x58\x68\x1c\x0d\x84\x71\x52\xca\x44\xe0\x61\x9d\x0f\x54\xe3\x79\x4b\xc5\x9a\x9c\xa2\xb9\x63\xb9\x0d\x95\x21\x58\x84\x5d\x0e\xcf\xca\x5c\x14\x84\xe1\x4c\xb8\xd9\x77\xb2\xf4\x07\xbf\xa7\x87\xf5\x9e\xda\xd4\x6e\x94\x39\x4a\x55\x3f\x8c\xbe\xcf\x07\xb2\x0a\x34\x41\x95\x70\x41\xd0\x58\x59\x50\xb1\xa6\x20\x33\x7c\x97\x89\xe5\xe5\xc8\xa0\x7c\x3e\x12\x73\x53\x67\x67\xae\x41\x05\x7c\x1b\x8c\x14\x20\x21\xfd\xab\x7f\x4b\xba\x0a\xfd\x88\xb0\x6d\x6f\x9f\x2b\xa0\xca\x3d\x78\x24\x13\xd0\x06\xa2\xc6\x92\x6d\x05\xf0\x01\xdf\xc2\xff\x9b\x67\x48\xcc\x36\xa8\x79\x2f\xc8\x7d\x03\x54\xb9\x35\xe5\xda\x95\x21\x44\x3c\xbb\x57\x1e\xc5\xe3\xb6\xbe\xa4\x02\x83\x91\x8f\xf6\x9b\x0f\x28\x72\x8c\x70\x98\xc3\x17\xbd\xe5\x43\xc6\xb3\xb8\x5b\xe6\x03\x54\x73\xb2\xa5\x19\xd0\x8e\x50\xfb\x56\x4c\x1c\xaa\xa1\x29\xc8\x78\x45\x7b\x2c\x25\xdd\x32\x57\xa0\xa2\xbf\x3b\x3e\x01\xdf\xc2\x6a\xec\xf1\x37\xf9\x02\x7e\xe2\xf3\x6d\x11\x68\x50\xd8\x5d\xc7\xe5\x14\xed\x99\x1d\x2a\xfc\xe1\x5e\x44\xc0\x44\x20\x3f\x47\xdf\x21\xa4\x80\x67\xb1\x47\xbe\x23\x27\xa6\xfe\x80\xfa\xdb\x02\x40\x50\x76\x63\x06\x39\x84\x7d\x59\xc5\x82\x5e\x03\xe1\x23\xc2\x62\x7e\xee\x12\xec\xc4\x24\xd0\x38\x92\xe2\x6e\xae\x56\xb5\xbe\xaa\xcd\x14\x02\x34\x41\xc4\xe2\x76\x47\x9a\x95\x6b\x34\x91\x36\xaf\x30\x75\xcb\x9b\x43\x68\xa8\x3d\x38\x22\x26\x73\x1e\xc5\x69\x11\x9b\x5b\xba\xe4\xbb\x86\x38\x31\x09\xad\x1c\x17\xd3\x98\xa4\x2e\x43\x3d\x33\x91\x99\x32\x7e\xaa\xca\x9a\xa8\xc8\x60\x13\x8b\x07\x4e\x4c\x15\x06\x23\x3f\xa2\xb8\x46\x6b\x93\x03\xc4\xf7\x58\xe1\xbb\x6a\x08\x8c\x43\xfe\x0d\x46\xde\xea\x78\x40\x3a\x42\x5b\x1c\xaa\x80\x1e\xaa\x28\x0e\xde\xf0\x75\x3e\x9f\x85\x67\xe8\x89\x17\xd0\x99\x69\x40\xa2\xf2\x23\xf4\xca\x44\xd8\x66\x94\x7b\xc9\x1b\x9b\xeb\x29\x78\x54\xee\x9d\xb0\x8b\xf0\x05\x3f\x55\x8e\x5d\xc8\x33\xc2\x36\xbf\xee\xe8\x1a\x36\xbe\x72\xa3\x3e\x92\x4d\x29\xcb\x75\x3e\xcb\xcc\x8e\x00\xd6\x6b\x88\x10\xd9\xb1\xdb\xe9\xcf\x0d\x46\xde\x97\x8d\xc2\x9f\xc8\x19\xa3\x1d\x61\x27\xbf\xad\xa7\x3f\x63\x7c\x4b\x43\x76\x50\xeb\x80\xef\x10\xcf\xd0\x34\x28\xbf\xaf\x52\x8f\x3c\x57\x8e\xd3\x66\x1c\x06\x4b\x3a\xb2\xa4\x34\x44\x7e\x85\xf1\xd3\x92\x66\xb9\xf6\x70\xb4\x8f\xf4\x26\x0f\x6d\x93\x17\xf3\x26\x5d\xa4\x7c\x9e\x13\x13\x84\x93\x7c\x07\xcd\x41\x9f\xe7\xe6\xaa\xdc\xc3\xcf\x6d\xc2\x41\x98\x36\x90\x81\xbb\x67\x07\xa8\x1d\xb3\xca\x31\xf0\x51\x7d\x87\x00\x21\xcf\xe0\x29\xcf\xe0\x33\x53\xa1\xe2\xbe\xb2\x98\xcb\x5a\xb3\xcd\xb7\x4b\x3e\x05\x39\x84\x2d\x09\xc8\x6c\x6f\x49\x2f\x04\x24\x9b\x76\x93\x05\x38\xd9\x92\x81\xa0\x19\x98\x29\xa8\xed\x52\x47\x23\x0b\xd1\x43\xbc\xe8\x64\xc8\xb7\x28\xa2\xdf\xa2\x4e\xb6\x6f\x1b\xa3\xa3\xcf\x90\x8c\x24\x1c\x28\xe5\xbc\x8b\xdd\x6f\x63\xc3\x33\x07\xa6\x16\xf7\xe4\xcb\x11\x9b\xda\x1c\x08\xf9\x8e\x3c\xdf\xf1\x6d\xfe\x88\x00\x4b\x97\x83\x91\xa5\x8b\x65\x6e\x6c\x19\xb7\x20\xba\x3b\xfa\x5f\xe5\x23\xad\x73\xfc\xa4\x14\x8d\x57\xed\xb3\x2b\xfe\x3b\x5a\xe6\xa1\x98\xe9\xad\x3e\x89\x4a\xba\x75\x2c\x37\x6a\xc8\x39\xcf\xad\x73\xc4\x14\x7a\xb7\x5e\x99\x53\x75\xca\xd7\x97\xb9\x42\x65\xbe\x8b\x88\xd9\x0c\x0d\xed\xa8\xcc\x45\xda\xb5\x9b\xa2\xdc\x63\x3c\x55\xdf\x4f\xde\xe1\x4b\xe9\x92\x27\x26\xa8\xe6\x68\x36\x47\x4e\x47\xfa\x62\x33\x57\x73\x89\x66\x6e\x13\xec\x11\x9e\xc5\x84\xe7\xf0\xd0\x96\x52\x51\x66\xc5\x76\xb5\x17\x06\x39\x45\x13\x69\xd0\x06\xaa\xa4\x3d\x90\x02\x33\xd9\xe4\x87\xf1\x1d\x1f\xef\xb7\x42\xbf\xa7\xc3\xd9\x26\x96\xe5\x60\xd0\x6b\xb8\x93\x75\x1e\xd1\x5c\xdd\xcd\x29\x0c\xd7\x79\x67\x61\x01\x3d\x60\x4e\x5c\xfd\x19\xeb\x41\x11\xb3\x1b\x02\x44\x38\xee\x10\xd2\xcc\xe1\x00\xf2\x23\x33\x9b\x20\x71\x17\xcd\x25\x1a\x20\xa8\xf2\x49\xe9\x27\xbe\x23\x42\xb3\x9c\x2f\x51\xb1\xb3\x7c\x9a\x75\x43\x71\x30\x54\x9e\xe6\xc2\x32\xec\x32\x11\x9e\x99\x1c\x5c\xd6\xfb\xb6\x27\xf2\x09\x10\x1e\x6f\xd6\x2d\x7b\x91\xf4\x72\xdd\xa7\x1c\x2b\x69\x53\x7f\xc3\xd7\x66\xbf\xaa\x19\xf6\x08\x92\x30\x0d\x61\x69\xe9\x32\x2c\xf3\x24\xa3\xd1\xab\x73\x7a\x84\x5d\x2e\x41\x2e\xad\x25\x8a\xe7\x9f\x53\x3b\xd2\x5e\x5f\x7f\x22\x64\x68\x56\xf8\xb7\xe6\x79\xb3\x7e\x5e\x8e\x8b\x81\x97\xfb\xbe\xe3\x7a\x5d\x65\xa8\x54\xb2\x77\x62\x30\x5b\xf3\x3b\x37\x39\x10\x95\x58\x4d\xad\xeb\x60\xa4\x04\xda\x70\xa8\xc2\x3e\xc9\x07\x38\xcd\x33\x38\xc2\x89\xd2\x96\x54\x4d\x56\x65\x96\x54\x54\xec\x99\xdd\xce\x2b\xf9\xee\x4e\x0c\x24\xa2\x18\x05\xb4\x49\x45\xd1\x9a\x1d\x03\x73\x5b\x1a\x4e\xee\xef\x71\x97\x6b\x3e\x78\x5b\xc3\xe4\x83\xbd\x6f\xa7\x6b\x1a\x93\x32\x17\x8d\x6f\xe3\x43\x35\x84\x9a\x8a\x0b\x82\x1a\xba\x63\x19\x13\xd5\xbd\xbd\x4a\x20\x0c\x35\x48\xf7\x6d\xc2\x5d\x9d\x69\x5b\x91\x35\x57\x50\xb1\x07\x52\x58\xca\x7d\x15\x43\xfa\x09\x87\x6a\x70\xb6\x2d\x00\xda\x13\x34\xf7\x1e\x03\x16\x4a\xb2\x8a\xd3\xae\x21\x27\x3b\xbe\xfb\xc2\xfa\xe5\xba\xdc\x29\x1b\x89\xcf\xf0\xbe\xbf\x07\x70\x51\x9f\x37\x71\xd4\x26\x37\x7e\x9d\xdb\xa3\xca\xed\xfa\x99\xc9\x6a\x50\xac\x72\x77\x4e\xd1\xc1\x81\x2a\x03\xb2\x23\x6b\x4d\x16\x84\xec\x58\xc2\xc8\x81\x1c\xc2\x8e\x81\x23\xdf\x60\x0a\x88\x1f\xb7\x23\xe0\xe5\xfc\xf0\x84\x1c\x40\x1b\x0c\xa4\x63\xf9\x42\x27\xdb\xdc\xe6\x0e\x9d\xa2\x59\xe6\x11\x01\x72\x9b\xc7\xa0\x62\xb1\xc0\x4c\x76\xd6\x83\xc2\xb8\xb6\x13\x7e\x89\xe2\x68\x19\xb3\xf4\x66\xfc\xce\x31\x46\x3e\x12\xda\x46\xdf\x77\xb9\x27\xdf\xe2\x58\xc2\x54\xe8\xe9\x08\xcd\xeb\x75\xc9\xaf\xec\x8d\x9e\xd9\x0d\x09\xb5\x85\xd9\x4b\x3a\xb1\x89\xe6\xdc\x35\x78\x5f\xc3\xc5\xfe\x81\xbf\x9f\xd8\x71\xe8\xdb\x3a\xb9\x34\x95\x85\x6f\x71\x60\xe2\x46\x60\xc6\x73\xe4\xcc\xee\x84\xbe\x85\xea\x35\xfa\xbe\x4b\x4c\x9a\xbd\xc3\xf9\x7b\x85\xe9\x68\xfe\xbe\x72\x88\xc5\xbc\xf4\x73\x9d\x7e\x77\xd4\x10\x17\x36\x07\xb1\x6a\x7f\xa3\xc6\x6f\x84\xa9\xe2\xca\x66\xc8\xa9\x69\x08\x98\xb3\xac\xfe\xbf\xa7\x50\xc5\x28\xa0\x60\xbf\x25\x86\x55\x8e\xca\x3a\xc7\xad\x41\x67\x96\x42\x62\x76\xa7\x5f\xd3\x9d\xef\xe5\xa9\x45\xe2\xd2\x65\xa8\xb9\x11\x48\xf3\xbe\x42\x3f\x76\x63\xcc\x1f\x06\x64\x68\x1a\xa3\xb9\x1d\x83\xdc\xa6\xd2\xa9\xd1\x10\xa0\xc5\xb1\x68\x5e\x76\x92\xd7\x75\xec\xb8\xdd\x57\x42\xb1\x23\xb7\xbf\xa7\xb3\xfe\xbb\x1c\xf7\x91\xbe\xf0\x37\xf9\x1d\x1c\x8b\xdb\x04\xbe\xaa\x73\x98\x4d\x14\x63\xc6\x22\x1c\x11\x08\x23\x37\xe3\x50\x98\x1c\xe6\x8f\x88\xc9\xd2\x26\x9a\x4d\x93\xa1\x31\x93\xc1\xd7\x71\x38\x1e\x58\x86\x54\xad\x53\x04\x94\x7f\xdc\x4f\x53\xe1\x0e\x6e\x6f\xf7\xab\xea\x1c\xe3\x35\xff\x23\x82\x9d\x55\xbc\x0b\x13\x87\x40\x73\x88\x26\xe4\x39\x31\x1f\xe9\xf8\xc4\x0d\xe8\xd2\x77\x95\x79\x9a\x9b\x78\xf8\x68\x2c\xb1\xe6\x5f\xf2\xeb\xfd\xad\x2a\x37\x53\xae\xe8\x23\xbc\x65\xa9\x67\x99\xaa\x63\xc9\x24\xd9\xc4\x9d\x2b\xea\x11\xc5\x3c\xa3\x88\x9c\xbb\x4c\xe8\x0b\x7e\xf2\x3f\x37\xbf\xff\xfe\x71\xa7\x35\x7d\xf0\xc9\x00\x17\x1d\x69\x96\xcc\xbd\x2c\xcd\x92\x79\xb0\x7e\x75\x79\xff\x5a\xb1\x23\xb5\xae\x03\xd7\x8b\x8b\xea\xa0\xb6\x23\xa7\xaf\xd5\x6f\x64\x6b\xb9\x97\x51\x79\x1e\xf8\xb1\x77\xf4\xb8\xb7\xd9\xce\x73\xbe\xa2\xf8\xda\x8b\xe4\xa7\xce\xa5\xe8\x57\x47\x1c\xad\x29\x2c\xef\x8f\x93\xbd\xf9\x72\x55\xbf\xe3\x6f\x65\xc9\x6d\x75\xa2\xda\xc9\x77\xd8\x7e\xff\x67\xf9\x32\xf6\x4b\xf1\x5d\x74\xf4\xe1\xee\xb9\x6d\xe5\xdb\xf4\x27\x0f\x6f\x7b\x79\xfa\xe0\xcb\x13\x12\x99\xea\x6c\xb8\xfb\xfd\x93\xe7\x14\xc7\x82\x9e\xe2\x15\x1f\x74\x56\xe2\xe1\xa1\x87\x04\x76\x8b\x7d\xfd\xb0\x43\x0f\xa9\xf5\x69\x69\x65\xdb\xf7\x59\x02\xbd\x6a\x80\x22\x2f\x2e\x0f\xa6\xf1\x67\x81\xfb\xe2\x95\xbc\xc0\xdd\x97\xda\xb1\x4b\xc0\xca\x33\x18\xe4\xe1\xd5\xfd\x95\xec\x59\xae\x97\x1d\x91\xe8\x6b\x7c\x9d\x38\x32\x67\xf7\xa8\x9c\x77\xd1\xdb\x3b\x22\x65\x7b\x1c\xca\x9b\x68\x29\xd5\x91\x13\xf7\xfb\x47\x4f\x20\x6a\xf9\xcc\xae\xae\xd6\xfa\xed\x92\x23\x2a\xb0\x2f\x57\x41\xec\x7a\xcf\x83\xf1\x45\xc5\x6f\xee\x8e\xe0\xd9\x87\x9c\x15\xb9\xb9\x55\xec\xc5\x21\x62\x87\x76\xf4\x3e\x15\xde\x58\xdf\xf7\x97\xcf\x05\x56\x7b\x62\xf8\xbe\xe3\x19\xa5\x0f\x17\xde\xfe\x74\xee\xf0\xcc\xdc\x9b\x7b\x59\x05\xee\x47\x0e\xa4\x3d\x7b\xca\xca\x75\xee\x24\xe9\x2b\x47\x46\xbf\xdf\x76\x5e\x90\x3b\x76\x60\xb5\x37\xb7\xe0\xac\x54\x10\xb6\x3c\x68\x38\x2e\x0f\x00\xbd\x1e\xaa\xcd\x63\x67\xfb\x5d\x2f\x82\xd8\x4d\x16\xeb\x4b\xf3\xae\x87\x2a\x7e\xbc\x58\x61\x65\xbe\x57\xd4\x27\x32\xa8\xef\x3a\xc5\xf6\xaa\x3a\xc8\x2f\x28\xbc\x2c\xb0\x4e\x7b\x39\x0b\xc2\xc1\xf8\xd5\x23\x5d\xce\x1c\x83\x83\x46\xd7\x2a\x92\xf2\x78\x95\x9e\x97\xe7\xea\xc4\x8a\xcf\x1d\x13\x58\x4c\x32\x2f\x9f\x24\x10\x0d\x6b\x03\x3b\x53\x98\x72\x2b\x95\xb5\xe0\x70\x57\x95\xe2\x19\x84\xe7\x0e\x30\x5e\x9b\x68\x67\x7b\x62\x1f\x33\xf1\x9c\xf0\xec\x29\x86\x5e\x91\x05\xce\xfa\xb6\xc1\xeb\x56\x90\x52\x73\x2b\x80\x96\x1d\x40\xa4\xa7\x17\x57\xce\x53\xab\x3c\x6f\xf2\x3a\xda\x0c\x5c\x7c\xe1\xc0\xed\x4b\x2b\x88\x3c\xca\xf7\x33\xcf\xdf\xc0\x14\x35\xf7\xb2\x0b\x8e\x63\x5c\x0f\x7f\x12\xd7\x2a\x54\x5d\x5a\xa7\xd6\xe2\x67\xea\xe7\x6f\x3d\x53\xe8\x88\x29\x5c\xbd\x6b\xac\xae\x13\xd7\x2a\xac\xbb\x97\x80\x56\x9d\xcf\xd3\x4f\xe2\xa0\x48\xb2\x3b\x25\x88\x7d\xe8\xd5\x06\xd1\x9f\xc1\x22\x48\xa1\xd7\x2f\x45\xcd\xd4\x3a\x7e\x51\xf4\x69\xcd\x8a\xa4\x1f\x14\x81\x6f\x15\xde\x69\x50\xb1\x9c\x77\x5f\x1d\x57\x55\x5d\x9f\xd0\x71\x78\xbe\xd9\x1e\xe4\xbf\x76\x1f\x67\x89\xfd\x5b\x69\xf0\x71\x1e\xf8\x93\x22\xbf\xdf\xa1\x5e\xa3\x55\x75\x1e\xe5\xad\xe5\x9f\x39\x96\x77\xe1\xd9\x9d\x24\x09\x5f\x0c\xcc\x85\xa1\xfc\x65\xc7\x70\xef\xc6\xa2\xd6\x8e\xd5\xdc\x5a\xd0\xcb\x8a\x57\x83\xe0\x0b\xbc\xdc\x46\x0c\x95\x91\x51\x88\xe6\xab\x11\xa9\x0f\x13\xdb\x7a\x71\xaf\xf1\x47\x79\xc1\xa7\x5b\xac\xf1\xe1\x27\x75\x5f\xe8\x90\x2e\x89\x91\xde\xe0\x7a\x8f\x5c\x6c\xf0\xcb\xba\xde\x13\x4e\xf5\xd0\xf7\x7e\xed\xfc\xd5\x5d\xef\xd7\xc7\x4f\xd7\xfb\xe9\x7a\x3f\x5d\xef\x7f\x9e\xeb\x75\xbd\xf2\x90\x40\xf7\xd3\xed\x6e\x1e\xff\x94\x6e\xf7\xaf\x37\xe3\xfd\x9c\xf0\x36\xce\x5d\x22\xf5\x67\x7b\x5d\xf0\xe9\x75\x5f\x7c\x3e\xbd\xee\x29\x79\x7d\x7a\xdd\xed\xe6\x4b\xec\x15\x9f\x1e\x77\xf3\xf8\xc7\x79\xdc\xc3\xc1\x38\x7b\x96\xe6\x97\xab\x9b\xfb\x53\xfb\x45\x87\x1b\x44\xfb\xdc\xb7\x12\x67\x16\x79\x71\xd1\xa2\xef\x0f\x28\xe7\x07\xdb\x6e\x27\x0e\xf1\xbc\xba\x21\x1f\xb1\x47\x92\xb0\x9b\xb7\x8f\x8f\x04\x76\xfb\x60\x8f\x9b\xb7\x56\xa3\xd1\xbc\x1d\xe3\x4d\x8f\x7c\x74\x1e\x3d\xa2\x69\xdd\x5c\x7d\xb9\xba\xa1\x03\x08\x83\xd8\xbf\xba\xbf\xda\xb6\x7a\xb5\x26\x77\xc5\x24\x71\x75\x5b\x64\x72\x6c\x1b\xea\x88\x4e\xbd\xc2\xf9\x7d\xb9\x1f\xeb\x7a\x59\x7e\xb8\x5b\x76\x48\xf6\x6c\x6c\x83\x62\x93\x57\x4e\xf5\xff\x56\xf1\x1d\xdd\xd2\x42\x3c\xb7\xbc\x71\x10\x07\xd5\x99\x9d\x9b\x6d\x99\x43\xb4\x39\xb7\x4d\xb8\x25\x52\x2a\x64\xd3\x76\x49\xc7\x7d\x7a\xba\x1d\x7b\x0f\xcd\xdb\x07\x02\xff\x7a\x4b\x36\x9e\xec\xdb\x31\xf9\xf8\xd0\x78\xf4\xf0\xe6\x43\x13\x3b\xb1\xcb\x96\x6e\x37\x0d\x4b\x6e\x2e\x1b\xf4\xd7\x49\x6d\x7c\xda\xc1\xbe\xe4\xeb\xbb\x5b\x1f\x88\x01\xe4\x2d\x86\xdf\xa6\x99\x37\x0f\xbc\xc5\xc7\x60\xc1\xb7\xab\xc3\x37\x46\xe7\xe7\x60\xfd\x14\x88\x97\x3b\x73\xfb\x1c\x9e\x3e\xdc\xfa\x02\xe3\xac\x41\xd1\x8d\x73\x33\x89\xbd\x3f\x17\xeb\x9b\x1f\xb4\xb5\x67\x55\xb7\x74\x28\xeb\xb0\xf0\x54\x40\xbe\xbe\xcb\xa3\x3c\x87\xf8\x95\x79\x4d\x59\x18\xc7\xee\xca\xff\xee\x89\x87\xe3\x21\xdc\xcb\xcc\x94\x63\x41\xd1\xfa\x92\x9a\xef\x7d\xd1\xec\x5e\xd7\x90\x7c\x77\xd9\x3f\x17\xcb\x57\x1a\xa1\xac\x6f\xd5\x28\x15\xf0\x03\x6f\x44\x3e\x46\xbe\xf6\xc2\x71\x7e\x26\xb4\xda\x34\x55\x58\xfe\xab\x51\x55\xfd\x39\x77\x5b\x72\x5e\x41\x5a\x3b\x76\xd3\x24\x88\x5f\x19\x98\xdd\xcf\x85\x17\x40\xac\x69\xef\xdb\x5b\xd7\x5b\x82\x0b\x2e\x57\xde\x10\xa9\xed\xef\x6d\xf7\xe4\x5c\xff\xff\x97\x25\x6a\x5d\x70\x85\xcb\x79\x3e\xbf\x45\x1c\xe5\xe4\x83\x49\xf2\x28\xc9\x5b\xf4\x2f\x23\x93\x57\x4b\x9c\xae\x7f\xe1\xe5\xc9\xeb\xdb\xb3\x3e\x74\xb6\xb0\x9e\x24\x5c\xee\x0f\x0e\x52\x85\x7e\xce\x9b\x6a\x7f\x62\x57\xf1\x80\xb0\x96\xf8\x65\x5d\xc5\x9a\xfd\x9f\xd7\x55\xa4\xde\x9f\xe0\x2d\xd2\x2c\x98\x5b\xc5\xc6\x5b\xac\xf9\x2c\xaf\xdf\xad\x64\x7d\xdd\xaa\xee\x85\x75\xbf\xfd\x06\x75\xef\x7b\xe1\x40\xea\x55\xeb\x05\xd8\xcb\x79\xf5\x27\x1c\x58\x10\x26\x0b\xb0\xd7\xd9\xea\x1e\x97\x57\x56\xb0\x50\x15\x36\xc9\x16\x56\xe6\x7a\xae\x9a\x59\xe3\x71\xe0\x9c\x29\xce\x59\x85\xb7\xb0\x96\x6a\x66\xc5\x79\x50\xd4\xb9\xc8\x47\x4a\xcf\x72\x4f\xf6\xa2\xa4\xf0\xd6\x35\xf2\x57\xca\x66\x65\xc1\x7d\xe6\x4f\x43\xda\x7b\xee\x58\xdc\xda\x5e\xad\x41\x47\x57\xef\x2f\xcb\x1e\x5e\xbb\xa4\xfb\xd4\xf3\xb2\x20\xf6\x6f\x3f\x48\x35\x0f\xfe\x1e\x56\xd4\xbf\x67\x42\xe2\xc7\x5f\x9a\xfe\xd1\x79\xba\x6f\x1f\xc6\x7f\xbe\xcf\xc0\x3f\x2d\xf0\xc7\x58\xe0\xfc\xd4\x85\xa6\x17\x9b\xde\xce\xe0\xef\x5a\xe0\x37\x05\x89\xff\xb9\xa6\x77\x60\x2a\x1f\x65\x81\x47\x87\xf1\xfb\x99\x5e\x18\xc4\xa5\xca\x71\xe5\x3a\xce\x76\x09\xec\xad\x6b\xad\x4e\x12\xe7\x41\x5e\x78\xb1\xb3\x2c\x63\x9f\xe3\xef\xc7\xac\x07\x63\x8c\x66\xbb\xcc\xb6\x46\xcf\x9b\x7b\xb0\xda\x21\xcb\x92\xd8\xbf\x6c\x2f\xe9\xfc\x8c\xef\x95\x68\xb8\xae\x5c\x6f\x33\x5e\x22\xc4\x3d\x86\x5e\xc6\x5a\x47\x58\x3c\x58\x27\x1c\x8c\xc7\x5e\xb6\xb3\x19\x58\xbe\x12\x70\x4c\x71\x82\x54\xb6\x62\xdf\x63\x03\x58\x54\x57\x45\x6e\x36\x76\x70\xec\xe1\xee\x81\xb8\xc3\xc9\xe6\x1d\x49\x7c\x79\xc0\xee\x1e\xbf\xde\x35\x1f\xee\xf0\x06\xfe\xa5\x49\xdc\xe1\x8f\x5f\xef\xbe\xde\x35\xb0\xf2\xfb\x57\xf2\xae\x89\xdd\x3d\x34\xcb\x3f\x9e\x1e\xef\xf0\xa7\x87\x3b\xe2\xeb\xcd\x97\xab\x60\xfc\x9b\xf7\xc7\xcc\x82\xf9\xde\xd6\x84\xf7\x5c\x64\x56\x3d\xeb\xe6\x87\x79\xb9\x2f\x51\xfd\xf3\xe5\xea\xe6\x0b\xfa\xf6\x7a\xf1\xe3\x36\x10\xe4\xfb\xd0\x57\xf5\xa9\x7d\x2e\xad\x60\xdf\x36\xe4\x19\x7c\x65\x82\xf5\xda\x75\xfb\x3f\xf2\xd2\xe8\x0b\x75\xa2\x9a\x0d\x74\xbd\x25\x6d\xe5\x9e\xdb\xf7\x0a\x0b\xa9\x89\x9e\x05\x85\xb7\xe7\xd4\x2e\x42\xed\x7f\x9c\x5d\x96\xfe\xb6\xcd\x98\x8f\x09\xea\xd7\x73\xad\x23\xb0\xb1\xc6\x82\xf6\x73\xea\x65\x81\x17\x57\x4b\x41\x4c\x92\x79\x57\xbf\x29\x52\xef\xf7\x1f\xb3\x9b\x40\xde\x62\x4f\x3f\x38\x5e\xdb\x47\xf7\x0f\x08\x91\x6a\x66\xce\x86\x16\x37\x94\x3c\xb8\x39\x16\x25\x1c\xd1\xd5\x24\xad\x01\xf6\x04\xcd\x62\x92\x25\x33\x7f\x92\xce\xca\xfb\x54\x9b\x18\xf6\xde\xe8\xe3\x4d\x9b\xa5\x48\x96\xa8\x17\xdf\xba\xd1\x98\xff\x01\x5b\xeb\xdf\x7e\xbe\xd9\xeb\xc7\x69\xe4\x9f\xbe\xaf\xf5\x7e\x6d\xa5\xf2\x65\xec\x0c\xca\x1c\xa7\x57\xee\x45\xbe\x4e\xad\xac\x28\xc5\xde\xf5\x4e\xc7\x1d\xeb\x92\xc5\xe4\xfc\x12\xf1\xf5\x7d\xf0\xca\x6a\xcd\x89\xf4\x9b\xab\xdd\x70\xaa\x63\xe5\x93\x37\x5e\x11\x5e\x21\xa1\x5a\xa0\x40\xe8\x2b\xf6\xf0\x84\x61\x6f\xb5\xd1\xef\x68\x6a\xe8\xfb\xc1\x60\x7c\xa8\xf9\xdd\x3b\x49\x5c\x58\x41\xfc\x32\x21\xeb\x2f\x62\x89\x7b\xd2\xb8\xc4\x2c\x4f\x61\xe0\x3b\xdb\xff\xd9\x91\x60\x9d\x7e\xf2\x1f\x81\x00\x3f\x99\x5d\xaf\x45\xfb\x69\xcf\x9f\xf6\x7c\x44\xc7\xbe\x93\x3d\xaf\x73\x4b\xff\x3a\x2e\xfd\x16\xff\xc9\xcc\xbe\x1e\x81\x4f\xbb\xff\xb4\xfb\x23\x4a\xf6\x9d\xec\x7e\x90\x7a\xb1\x32\x09\xc6\x05\x53\x65\xa8\xfd\x40\x00\xd8\xa3\xf8\x83\xa1\x60\x16\x07\x7f\xcc\xbc\xae\x77\x6e\x71\x74\xbf\xf0\xf9\x5e\x5d\xb0\xad\x7e\x99\x78\x36\xc5\xef\xc3\xd7\xa4\x53\x7f\x5e\x4f\x88\x39\xb3\x67\xfe\x1d\x98\x5e\xe7\x3b\xee\x65\xf2\xf3\xee\xab\x03\x5d\x7f\x7e\xbe\xae\x04\x5e\x5c\x7c\x0c\xf3\xa7\xb5\xfc\x97\x88\x4c\x5f\x80\xc5\xa7\xaf\xfa\xf4\x55\x47\xb4\xed\x3b\xf9\xaa\x61\x92\x15\x2f\x72\x9b\xb7\xad\x7c\x46\xa8\xc7\x89\xee\x2f\x0a\x3f\xfc\xe0\x45\x61\xf4\xbd\x1a\xb8\x4f\xb0\xf8\x04\x8b\x23\x2a\xf6\x9d\xc0\x42\xd9\x79\xc5\xe7\x3f\x63\x56\xfb\x93\x05\x03\x7b\x02\xfe\xb4\xed\x4f\xdb\x3e\xa2\x69\xa7\x5e\xc5\xfc\xc0\x43\x36\x2f\xd0\xbb\x57\x8f\xfc\xfc\xf6\x97\x18\xb7\xfc\xff\xd0\x17\x10\x2d\xc7\x75\x1f\x09\xeb\xf1\xb6\xd1\x78\x6a\xde\x3e\x3c\x79\xe3\x5b\xdb\x7d\x20\x6e\xc7\x5f\xb1\xaf\x63\xdb\x7a\xc2\x2d\xef\xf1\xc2\x17\x10\xcf\x4b\xfd\x57\x7a\xf9\xf0\x43\x14\xf1\x86\x45\x4a\xb6\xce\x16\xd8\x7f\x9f\xf6\x2f\xab\x71\x0f\x2e\xf9\x68\x93\x4f\xf6\x2d\xee\x3e\x8c\x6f\x1f\x1e\x9f\x1e\x6f\x2d\x82\xc4\x6f\x9d\xaf\x8f\x4f\x8d\x07\x97\xc0\x89\x77\x69\xdc\xf8\x2f\xa5\x71\xbf\xc2\x5b\xe8\x97\xa3\xf0\xe7\xbb\xe7\xbf\xf8\xbb\xe7\xff\x59\xd0\xff\xab\xe6\xe7\x7c\x8f\x37\xcb\xdf\x0f\x20\x87\xef\x9b\x6f\xcf\xab\xff\x90\x37\xde\x7f\xaf\xbd\x6b\x4b\x54\xae\x50\x03\x6f\x87\x8c\x43\x0e\x7f\x1c\x4e\x7c\x6f\xd9\xfc\x50\x1c\xb1\xbd\xb1\x37\xb6\x30\xfc\x96\xb0\x08\xf2\xf6\x01\x27\x1f\x6f\x9f\x1a\xd6\xd3\x2d\xf1\x48\x8c\xc7\x8d\x86\xe3\x35\xf0\x87\xbf\xa4\x43\xff\xd0\xcc\xd3\xef\xa7\x2a\xa7\x70\xe6\x6f\xd5\xdf\xff\xfe\xdb\xff\x0b\x00\x00\xff\xff\x49\xa7\xe4\x46\xe4\xd2\x00\x00")
 
 func rpProductionJsonBytes() ([]byte, error) {
 	return bindataRead(
diff --git a/pkg/deploy/generator/resources.go b/pkg/deploy/generator/resources.go
index 745ea7327..3b451ec71 100644
--- a/pkg/deploy/generator/resources.go
+++ b/pkg/deploy/generator/resources.go
@@ -845,6 +845,11 @@ cat >/etc/td-agent-bit/td-agent-bit.conf <<'EOF'
 	Remove_wildcard _
 	Remove TIMESTAMP
 
+[FILTER]
+	Name rewrite_tag
+	Match journald
+	Rule $LOGKIND ifxaudit ifxaudit false
+
 [OUTPUT]
 	Name forward
 	Port 29230
diff --git a/pkg/frontend/adminactions/upgrade.go b/pkg/frontend/adminactions/upgrade.go
index 28d158943..e71b53a88 100644
--- a/pkg/frontend/adminactions/upgrade.go
+++ b/pkg/frontend/adminactions/upgrade.go
@@ -5,7 +5,6 @@ package adminactions
 
 import (
 	"context"
-	"fmt"
 	"net/http"
 
 	"github.com/Azure/go-autorest/autorest/azure"
@@ -92,7 +91,7 @@ func checkCustomDNS(ctx context.Context, oc *api.OpenShiftCluster, vnet network.
 	if v.VirtualNetworkPropertiesFormat.DhcpOptions != nil &&
 		v.VirtualNetworkPropertiesFormat.DhcpOptions.DNSServers != nil &&
 		len(*v.VirtualNetworkPropertiesFormat.DhcpOptions.DNSServers) > 0 {
-		return fmt.Errorf("not upgrading: custom DNS is set")
+		return api.NewCloudError(http.StatusInternalServerError, api.CloudErrorCodeInternalServerError, "", "Not upgrading: custom DNS is set.")
 	}
 
 	return nil
diff --git a/pkg/frontend/frontend.go b/pkg/frontend/frontend.go
index aa86b9b32..ab459b146 100644
--- a/pkg/frontend/frontend.go
+++ b/pkg/frontend/frontend.go
@@ -45,8 +45,9 @@ type azureActionsFactory func(*logrus.Entry, env.Interface, *api.OpenShiftCluste
 type ocEnricherFactory func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher
 
 type frontend struct {
-	baseLog *logrus.Entry
-	env     env.Interface
+	auditLog *logrus.Entry
+	baseLog  *logrus.Entry
+	env      env.Interface
 
 	dbAsyncOperations   database.AsyncOperations
 	dbOpenShiftClusters database.OpenShiftClusters
@@ -78,6 +79,7 @@ type Runnable interface {
 
 // NewFrontend returns a new runnable frontend
 func NewFrontend(ctx context.Context,
+	auditLog *logrus.Entry,
 	baseLog *logrus.Entry,
 	_env env.Interface,
 	dbAsyncOperations database.AsyncOperations,
@@ -90,6 +92,7 @@ func NewFrontend(ctx context.Context,
 	azureActionsFactory azureActionsFactory,
 	ocEnricherFactory ocEnricherFactory) (Runnable, error) {
 	f := &frontend{
+		auditLog:            auditLog,
 		baseLog:             baseLog,
 		env:                 _env,
 		dbAsyncOperations:   dbAsyncOperations,
@@ -261,7 +264,7 @@ func (f *frontend) authenticatedRoutes(r *mux.Router) {
 
 func (f *frontend) setupRouter() *mux.Router {
 	r := mux.NewRouter()
-	r.Use(middleware.Log(f.baseLog.WithField("component", "access")))
+	r.Use(middleware.Log(f.env, f.auditLog, f.baseLog.WithField("component", "access")))
 	r.Use(middleware.Metrics(f.m))
 	r.Use(middleware.Panic)
 	r.Use(middleware.Headers(f.env.DeploymentMode()))
diff --git a/pkg/frontend/middleware/log.go b/pkg/frontend/middleware/log.go
index 9e84ed015..b46ad574e 100644
--- a/pkg/frontend/middleware/log.go
+++ b/pkg/frontend/middleware/log.go
@@ -5,6 +5,7 @@ package middleware
 
 import (
 	"context"
+	"fmt"
 	"io"
 	"net/http"
 	"strings"
@@ -16,7 +17,9 @@ import (
 
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/api/admin"
+	"github.com/Azure/ARO-RP/pkg/env"
 	utillog "github.com/Azure/ARO-RP/pkg/util/log"
+	"github.com/Azure/ARO-RP/pkg/util/log/audit"
 )
 
 type logResponseWriter struct {
@@ -49,7 +52,7 @@ func (rc *logReadCloser) Read(b []byte) (int, error) {
 	return n, err
 }
 
-func Log(baseLog *logrus.Entry) func(http.Handler) http.Handler {
+func Log(env env.Core, auditLog, baseLog *logrus.Entry) func(http.Handler) http.Handler {
 	return func(h http.Handler) http.Handler {
 		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 			t := time.Now()
@@ -66,8 +69,7 @@ func Log(baseLog *logrus.Entry) func(http.Handler) http.Handler {
 				RequestTime:     t,
 			}
 
-			if vars["api-version"] == admin.APIVersion ||
-				strings.HasPrefix(r.URL.Path, "/admin") {
+			if vars["api-version"] == admin.APIVersion || isAdminOp(r) {
 				correlationData.ClientPrincipalName = r.Header.Get("X-Ms-Client-Principal-Name")
 			}
 
@@ -96,16 +98,100 @@ func Log(baseLog *logrus.Entry) func(http.Handler) http.Handler {
 			})
 			log.Print("read request")
 
+			var (
+				auditCallerIdentity                              = r.UserAgent()
+				auditCallerType                                  = audit.CallerIdentityTypeApplicationID
+				auditTargetResourceName, auditTargetResourceType = auditTargetResourceData(r)
+			)
+
+			if correlationData.ClientPrincipalName != "" {
+				auditCallerIdentity = correlationData.ClientPrincipalName
+				auditCallerType = audit.CallerIdentityTypeObjectID
+			}
+
+			var (
+				adminOp       = isAdminOp(r)
+				logTime       = time.Now().UTC().Format(time.RFC3339)
+				operationName = fmt.Sprintf("%s %s", r.Method, r.URL.Path)
+			)
+
+			auditEntry := auditLog.WithFields(logrus.Fields{
+				audit.MetadataCreatedTime:     logTime,
+				audit.MetadataLogKind:         audit.IFXAuditLogKind,
+				audit.MetadataSource:          audit.SourceRP,
+				audit.MetadataAdminOperation:  adminOp,
+				audit.EnvKeyAppID:             audit.SourceRP,
+				audit.EnvKeyCloudRole:         audit.CloudRoleRP,
+				audit.EnvKeyCorrelationID:     correlationData.CorrelationID,
+				audit.EnvKeyEnvironment:       env.Environment().Name,
+				audit.EnvKeyHostname:          env.Hostname(),
+				audit.EnvKeyLocation:          env.Location(),
+				audit.PayloadKeyCategory:      audit.CategoryResourceManagement,
+				audit.PayloadKeyOperationName: operationName,
+				audit.PayloadKeyRequestID:     correlationData.RequestID,
+				audit.PayloadKeyCallerIdentities: []audit.CallerIdentity{
+					{
+						CallerIdentityType:  auditCallerType,
+						CallerIdentityValue: auditCallerIdentity,
+						CallerIPAddress:     r.RemoteAddr,
+					},
+				},
+				audit.PayloadKeyTargetResources: []audit.TargetResource{
+					{
+						TargetResourceName: auditTargetResourceName,
+						TargetResourceType: auditTargetResourceType,
+					},
+				},
+			})
+
 			defer func() {
+				statusCode := w.(*logResponseWriter).statusCode
 				log.WithFields(logrus.Fields{
 					"body_read_bytes":      r.Body.(*logReadCloser).bytes,
 					"body_written_bytes":   w.(*logResponseWriter).bytes,
 					"duration":             time.Since(t).Seconds(),
-					"response_status_code": w.(*logResponseWriter).statusCode,
+					"response_status_code": statusCode,
 				}).Print("sent response")
+
+				resultType := audit.ResultTypeSuccess
+				if statusCode >= http.StatusBadRequest {
+					resultType = audit.ResultTypeFail
+				}
+
+				auditEntry.WithFields(logrus.Fields{
+					audit.PayloadKeyResult: audit.Result{
+						ResultType:        resultType,
+						ResultDescription: fmt.Sprintf("Status code: %d", statusCode),
+					},
+				}).Info(audit.DefaultLogMessage)
 			}()
 
 			h.ServeHTTP(w, r)
 		})
 	}
 }
+
+func auditTargetResourceData(r *http.Request) (string, string) {
+	if matches := utillog.RXProviderResourceKind.FindStringSubmatch(r.URL.Path); matches != nil {
+		if resourceKind := matches[len(matches)-1]; resourceKind != "" {
+			return resourceKind, ""
+		}
+	}
+
+	if matches := utillog.RXAdminProvider.FindStringSubmatch(r.URL.Path); matches != nil {
+		if resourceKind := matches[len(matches)-1]; resourceKind != "" {
+			return resourceKind, ""
+		}
+	}
+
+	if matches := utillog.RXTolerantResourceID.FindStringSubmatch(r.URL.Path); matches != nil {
+		resourceKind, resourceName := matches[len(matches)-2], matches[len(matches)-1]
+		return resourceKind, resourceName
+	}
+
+	return "", ""
+}
+
+func isAdminOp(r *http.Request) bool {
+	return strings.HasPrefix(r.URL.Path, "/admin")
+}
diff --git a/pkg/operator/controllers/genevalogging/const.go b/pkg/operator/controllers/genevalogging/const.go
index a9e91ca72..e622214db 100644
--- a/pkg/operator/controllers/genevalogging/const.go
+++ b/pkg/operator/controllers/genevalogging/const.go
@@ -29,36 +29,38 @@ const (
 	Time_Format %Y-%m-%dT%H:%M:%S.%L
 `
 
-	journalConf = `
+	fluentConf = `
+[SERVICE]
+	Parsers_File /etc/td-agent-bit/parsers.conf
+
 [INPUT]
 	Name systemd
 	Tag journald
 	DB /var/lib/fluent/journald
 
-[FILTER]
-	Name modify
-	Match journald
-	Remove_wildcard _
-	Remove TIMESTAMP
-	Remove SYSLOG_FACILITY
-
-[OUTPUT]
-	Name forward
-	Port 24224
-`
-
-	containersConf = `
-[SERVICE]
-	Parsers_File /etc/td-agent-bit/parsers.conf
-
 [INPUT]
 	Name tail
+	Tag containers
 	Path /var/log/containers/*
 	Path_Key path
-	Tag containers
 	DB /var/lib/fluent/containers
 	Parser crio
 
+[INPUT]
+	Name tail
+	Tag audit
+	Path /var/log/kube-apiserver/audit*
+	Path_Key path
+	DB /var/lib/fluent/audit
+	Parser audit
+
+[FILTER]
+	Name modify
+	Match journald
+	Remove_wildcard _
+	Remove TIMESTAMP
+	Remove SYSLOG_FACILITY
+
 [FILTER]
 	Name parser
 	Match containers
@@ -71,53 +73,37 @@ const (
 	Match containers
 	Regex NAMESPACE ^(?:default|kube-.*|openshift|openshift-.*)$
 
-[OUTPUT]
-	Name forward
-	Port 24224
-`
-
-	auditConf = `
-[SERVICE]
-	Parsers_File /etc/td-agent-bit/parsers.conf
-
-[INPUT]
-	Name tail
-	Path /var/log/kube-apiserver/audit*
-	Path_Key path
-	Tag audit
-	DB /var/lib/fluent/audit
-	Parser audit
-
 [FILTER]
 	Name nest
-	Match *
+	Match audit
 	Operation lift
 	Nested_under user
 	Add_prefix user_
 
 [FILTER]
 	Name nest
-	Match *
+	Match audit
 	Operation lift
 	Nested_under impersonatedUser
 	Add_prefix impersonatedUser_
 
 [FILTER]
 	Name nest
-	Match *
+	Match audit
 	Operation lift
 	Nested_under responseStatus
 	Add_prefix responseStatus_
 
 [FILTER]
 	Name nest
-	Match *
+	Match audit
 	Operation lift
 	Nested_under objectRef
 	Add_prefix objectRef_
 
 [OUTPUT]
 	Name forward
+	Match *
 	Port 24224
 `
 )
diff --git a/pkg/operator/controllers/genevalogging/genevalogging.go b/pkg/operator/controllers/genevalogging/genevalogging.go
index 3c10b4f6f..92a67d60e 100644
--- a/pkg/operator/controllers/genevalogging/genevalogging.go
+++ b/pkg/operator/controllers/genevalogging/genevalogging.go
@@ -118,88 +118,14 @@ func (g *GenevaloggingReconciler) daemonset(cluster *arov1alpha1.Cluster) (*apps
 					},
 					Containers: []v1.Container{
 						{
-							Name:  "fluentbit-journal",
+							Name:  "fluentbit",
 							Image: version.FluentbitImage(cluster.Spec.ACRDomain),
 							Command: []string{
 								"/opt/td-agent-bit/bin/td-agent-bit",
 							},
 							Args: []string{
 								"-c",
-								"/etc/td-agent-bit/journal.conf",
-							},
-							// TODO: specify requests/limits
-							SecurityContext: &v1.SecurityContext{
-								Privileged: to.BoolPtr(true),
-								RunAsUser:  to.Int64Ptr(0),
-							},
-							VolumeMounts: []v1.VolumeMount{
-								{
-									Name:      "fluent-config",
-									ReadOnly:  true,
-									MountPath: "/etc/td-agent-bit",
-								},
-								{
-									Name:      "machine-id",
-									ReadOnly:  true,
-									MountPath: "/etc/machine-id",
-								},
-								{
-									Name:      "log",
-									ReadOnly:  true,
-									MountPath: "/var/log",
-								},
-								{
-									Name:      "fluent",
-									MountPath: "/var/lib/fluent",
-								},
-							},
-						},
-						{
-							Name:  "fluentbit-containers",
-							Image: version.FluentbitImage(cluster.Spec.ACRDomain),
-							Command: []string{
-								"/opt/td-agent-bit/bin/td-agent-bit",
-							},
-							Args: []string{
-								"-c",
-								"/etc/td-agent-bit/containers.conf",
-							},
-							// TODO: specify requests/limits
-							SecurityContext: &v1.SecurityContext{
-								Privileged: to.BoolPtr(true),
-								RunAsUser:  to.Int64Ptr(0),
-							},
-							VolumeMounts: []v1.VolumeMount{
-								{
-									Name:      "fluent-config",
-									ReadOnly:  true,
-									MountPath: "/etc/td-agent-bit",
-								},
-								{
-									Name:      "machine-id",
-									ReadOnly:  true,
-									MountPath: "/etc/machine-id",
-								},
-								{
-									Name:      "log",
-									ReadOnly:  true,
-									MountPath: "/var/log",
-								},
-								{
-									Name:      "fluent",
-									MountPath: "/var/lib/fluent",
-								},
-							},
-						},
-						{
-							Name:  "fluentbit-audit",
-							Image: version.FluentbitImage(cluster.Spec.ACRDomain),
-							Command: []string{
-								"/opt/td-agent-bit/bin/td-agent-bit",
-							},
-							Args: []string{
-								"-c",
-								"/etc/td-agent-bit/audit.conf",
+								"/etc/td-agent-bit/fluent.conf",
 							},
 							// TODO: specify requests/limits
 							SecurityContext: &v1.SecurityContext{
@@ -371,10 +297,8 @@ func (g *GenevaloggingReconciler) resources(ctx context.Context, cluster *arov1a
 				Namespace: kubeNamespace,
 			},
 			Data: map[string]string{
-				"audit.conf":      auditConf,
-				"containers.conf": containersConf,
-				"journal.conf":    journalConf,
-				"parsers.conf":    parsersConf,
+				"fluent.conf":  fluentConf,
+				"parsers.conf": parsersConf,
 			},
 		},
 		&v1.ServiceAccount{
diff --git a/pkg/operator/deploy/deploy.go b/pkg/operator/deploy/deploy.go
index 60f728cc7..023dcfb31 100644
--- a/pkg/operator/deploy/deploy.go
+++ b/pkg/operator/deploy/deploy.go
@@ -277,20 +277,6 @@ func (o *operator) IsReady(ctx context.Context) (bool, error) {
 		return ok, err
 	}
 
-	// wait for conditions to appear
-	cluster, err := o.arocli.AroV1alpha1().Clusters().Get(ctx, arov1alpha1.SingletonClusterName, metav1.GetOptions{})
-	if err != nil {
-		return false, err
-	}
-	for _, ct := range arov1alpha1.AllConditionTypes() {
-		cond := cluster.Status.Conditions.GetCondition(ct)
-		if cond == nil {
-			return false, nil
-		}
-		if cond.Status != corev1.ConditionTrue {
-			return false, nil
-		}
-	}
 	return true, nil
 }
 
diff --git a/pkg/util/log/audit/audit.go b/pkg/util/log/audit/audit.go
index 160510032..0f8c47a79 100644
--- a/pkg/util/log/audit/audit.go
+++ b/pkg/util/log/audit/audit.go
@@ -6,19 +6,22 @@ package audit
 import (
 	"encoding/json"
 	"sync"
-	"time"
 
 	uuid "github.com/satori/go.uuid"
 	"github.com/sirupsen/logrus"
-
-	"github.com/Azure/ARO-RP/pkg/env"
 )
 
 const (
-	MetadataCreatedTime = "createdTime"
-	MetadataPayload     = "payload"
-	MetadataLogKind     = "logKind"
-	MetadataSource      = "source"
+	// see pkg/deploy/generator/resources.go#L901
+	CloudRoleRP = "rp"
+
+	DefaultLogMessage = "audit event"
+
+	MetadataCreatedTime    = "createdTime"
+	MetadataPayload        = "payload"
+	MetadataLogKind        = "logKind"
+	MetadataAdminOperation = "adminOp"
+	MetadataSource         = "source"
 
 	SourceAdminPortal = "aro-admin"
 	SourceRP          = "aro-rp"
@@ -29,7 +32,10 @@ const (
 	EnvKeyCloudRole           = "envCloudRole"
 	EnvKeyCloudRoleVer        = "envCloudRoleVer"
 	EnvKeyCorrelationID       = "envCorrelationID"
+	EnvKeyEnvironment         = "envEnvironmentName"
+	EnvKeyHostname            = "envHostname"
 	EnvKeyIKey                = "envIKey"
+	EnvKeyLocation            = "envLocation"
 
 	PayloadKeyCallerIdentities = "payloadCallerIdentities"
 	PayloadKeyCategory         = "payloadCategory"
@@ -39,10 +45,10 @@ const (
 	PayloadKeyRequestID        = "payloadRequestID"
 	PayloadKeyTargetResources  = "payloadTargetResources"
 
-	ifxAuditCloudVer = 1.0
-	ifxAuditLogKind  = "ifxaudit"
-	ifxAuditName     = "#Ifx.AuditSchema"
-	ifxAuditVersion  = 2.1
+	IFXAuditCloudVer = 1.0
+	IFXAuditName     = "#Ifx.AuditSchema"
+	IFXAuditVersion  = 2.1
+	IFXAuditLogKind  = "ifxaudit"
 
 	// ifxAuditFlags is a collection of values bit-packed into a 64-bit integer.
 	// These properties describe how the event should be processed by the pipeline
@@ -63,22 +69,17 @@ var (
 	seqNumMutex sync.Mutex
 )
 
-// NewEntry returns a log entry that embeds the provided logger. It has a hook
-// that knows how to hydrate an IFxAudit log payload before logging it.
-func NewEntry(env env.Core, logger *logrus.Logger) *logrus.Entry {
+// AddHook modifies logger by adding the payload hook to its list of hooks.
+func AddHook(logger *logrus.Logger) {
 	logger.AddHook(&payloadHook{
-		payload: &AuditPayload{},
-		env:     env,
+		payload: &Payload{},
 	})
-
-	return logrus.NewEntry(logger)
 }
 
 // payloadHook, when fires, hydrates an IFxAudit log payload using data in a log
 // entry.
 type payloadHook struct {
-	payload *AuditPayload
-	env     env.Core
+	payload *Payload
 }
 
 func (payloadHook) Levels() []logrus.Level {
@@ -86,105 +87,112 @@ func (payloadHook) Levels() []logrus.Level {
 }
 
 func (h *payloadHook) Fire(entry *logrus.Entry) error {
-	payload := *h.payload // shallow copy
+	h.payload = &Payload{}
 
 	// Part-A
-	payload.EnvVer = ifxAuditVersion
-	payload.EnvName = ifxAuditName
+	h.payload.EnvVer = IFXAuditVersion
+	h.payload.EnvName = IFXAuditName
 
-	logTime := entry.Time.UTC().Format(time.RFC3339)
-	payload.EnvTime = logTime
+	if v, ok := entry.Data[MetadataCreatedTime].(string); ok {
+		h.payload.EnvTime = v
+	}
 
-	payload.EnvEpoch = epoch
-	payload.EnvSeqNum = nextSeqNum()
+	h.payload.EnvEpoch = epoch
+	h.payload.EnvSeqNum = nextSeqNum()
 
 	if v, ok := entry.Data[EnvKeyIKey].(string); ok {
-		payload.EnvIKey = v
+		h.payload.EnvIKey = v
 		delete(entry.Data, EnvKeyIKey)
 	}
 
-	payload.EnvFlags = ifxAuditFlags
+	h.payload.EnvFlags = ifxAuditFlags
 
 	if v, ok := entry.Data[EnvKeyAppID].(string); ok {
-		payload.EnvAppId = v
+		h.payload.EnvAppID = v
 		delete(entry.Data, EnvKeyAppID)
 	}
 
 	if v, ok := entry.Data[EnvKeyAppVer].(string); ok {
-		payload.EnvAppVer = v
+		h.payload.EnvAppVer = v
 		delete(entry.Data, EnvKeyAppVer)
 	}
 
 	if v, ok := entry.Data[EnvKeyCorrelationID].(string); ok {
-		payload.EnvCV = v
+		h.payload.EnvCV = v
 		delete(entry.Data, EnvKeyCorrelationID)
 	}
 
-	payload.EnvCloudName = h.env.Environment().Name
+	if v, ok := entry.Data[EnvKeyEnvironment].(string); ok {
+		h.payload.EnvCloudName = v
+		h.payload.EnvCloudEnvironment = v
+		delete(entry.Data, EnvKeyEnvironment)
+	}
 
 	if v, ok := entry.Data[EnvKeyCloudRole].(string); ok {
-		payload.EnvCloudRole = v
+		h.payload.EnvCloudRole = v
 		delete(entry.Data, EnvKeyCloudRole)
 	}
 
 	if v, ok := entry.Data[EnvKeyCloudRoleVer].(string); ok {
-		payload.EnvCloudRoleVer = v
+		h.payload.EnvCloudRoleVer = v
 		delete(entry.Data, EnvKeyCloudRoleVer)
 	}
 
-	payload.EnvCloudRoleInstance = h.env.Hostname()
-	payload.EnvCloudEnvironment = h.env.Environment().Name
-	payload.EnvCloudLocation = h.env.Location()
+	if v, ok := entry.Data[EnvKeyHostname].(string); ok {
+		h.payload.EnvCloudRoleInstance = v
+		delete(entry.Data, EnvKeyHostname)
+	}
+
+	if v, ok := entry.Data[EnvKeyLocation].(string); ok {
+		h.payload.EnvCloudLocation = v
+		delete(entry.Data, EnvKeyLocation)
+	}
 
 	if v, ok := entry.Data[EnvKeyCloudDeploymentUnit].(string); ok {
-		payload.EnvCloudDeploymentUnit = v
+		h.payload.EnvCloudDeploymentUnit = v
 		delete(entry.Data, EnvKeyCloudDeploymentUnit)
 	}
 
-	payload.EnvCloudVer = ifxAuditCloudVer
+	h.payload.EnvCloudVer = IFXAuditCloudVer
 
 	// Part-B
-	if ids, ok := entry.Data[PayloadKeyCallerIdentities].([]*CallerIdentity); ok {
-		payload.CallerIdentities = append(payload.CallerIdentities, ids...)
+	if ids, ok := entry.Data[PayloadKeyCallerIdentities].([]CallerIdentity); ok {
+		h.payload.CallerIdentities = append(h.payload.CallerIdentities, ids...)
 		delete(entry.Data, PayloadKeyCallerIdentities)
 	}
 
 	if v, ok := entry.Data[PayloadKeyCategory].(string); ok {
-		payload.Category = Category(v)
+		h.payload.Category = v
 		delete(entry.Data, PayloadKeyCategory)
 	}
 
 	if v, ok := entry.Data[PayloadKeyOperationName].(string); ok {
-		payload.OperationName = v
+		h.payload.OperationName = v
 		delete(entry.Data, PayloadKeyOperationName)
 	}
 
-	if v, ok := entry.Data[PayloadKeyResult].(*Result); ok {
-		payload.Result = v
+	if v, ok := entry.Data[PayloadKeyResult].(Result); ok {
+		h.payload.Result = v
 		delete(entry.Data, PayloadKeyResult)
 	}
 
 	if v, ok := entry.Data[PayloadKeyRequestID].(string); ok {
-		payload.RequestID = v
+		h.payload.RequestID = v
 		delete(entry.Data, PayloadKeyRequestID)
 	}
 
-	if rs, ok := entry.Data[PayloadKeyTargetResources].([]*TargetResource); ok {
-		payload.TargetResources = append(payload.TargetResources, rs...)
+	if rs, ok := entry.Data[PayloadKeyTargetResources].([]TargetResource); ok {
+		h.payload.TargetResources = append(h.payload.TargetResources, rs...)
 		delete(entry.Data, PayloadKeyTargetResources)
 	}
 
 	// add the audit payload
-	b, err := json.Marshal(payload)
+	b, err := json.Marshal(h.payload)
 	if err != nil {
 		return err
 	}
 	entry.Data[MetadataPayload] = string(b)
 
-	// add non-IFxAudit metadata for our own use
-	entry.Data[MetadataCreatedTime] = logTime
-	entry.Data[MetadataLogKind] = ifxAuditLogKind
-
 	return nil
 }
 
diff --git a/pkg/util/log/audit/schema.go b/pkg/util/log/audit/schema.go
index e23c712ee..41f6d5a51 100644
--- a/pkg/util/log/audit/schema.go
+++ b/pkg/util/log/audit/schema.go
@@ -3,14 +3,14 @@ package audit
 // Copyright (c) Microsoft Corporation.
 // Licensed under the Apache License 2.0.
 
-// AuditPayload is the IFxAudit log payload that will be sent to Geneva. It has
+// Payload is the IFxAudit log payload that will be sent to Geneva. It has
 // all the required and optional fields defined in IFxAudit Part-A and Part-B
 // schema.
 //
 // Fields that are marked as optional or "required when applicable" in the
 // schema are marked with the omitempty tag. Fields that are marked as "unused"
 // are not included.
-type AuditPayload struct {
+type Payload struct {
 	// Part-A
 	EnvVer                 float64 `json:"env_ver"`
 	EnvName                string  `json:"env_name"`
@@ -19,7 +19,7 @@ type AuditPayload struct {
 	EnvSeqNum              uint64  `json:"env_seqNum,omitempty"`
 	EnvIKey                string  `json:"env_iKey,omitempty"`
 	EnvFlags               int     `json:"env_flags,omitempty"`
-	EnvAppId               string  `json:"env_appId"`
+	EnvAppID               string  `json:"env_appId"`
 	EnvAppVer              string  `json:"env_appVer,omitempty"`
 	EnvCV                  string  `json:"env_cv,omitempty"`
 	EnvCloudName           string  `json:"env_cloud_name"`
@@ -32,38 +32,29 @@ type AuditPayload struct {
 	EnvCloudVer            float64 `json:"env_cloud_ver"`
 
 	// Part-B
-	CallerIdentities []*CallerIdentity `json:"CallerIdentities"`
-	Category         Category          `json:"Category"`
-	OperationName    string            `json:"OperationName"`
-	Result           *Result           `json:"Result"`
-	RequestID        string            `json:"requestId"`
-	TargetResources  []*TargetResource `json:"TargetResources"`
+	CallerIdentities []CallerIdentity `json:"CallerIdentities"`
+	Category         string           `json:"Category"`
+	OperationName    string           `json:"OperationName"`
+	Result           Result           `json:"Result"`
+	RequestID        string           `json:"requestId"`
+	TargetResources  []TargetResource `json:"TargetResources"`
 }
 
 // CallerIdentity has identity information on the entity that invoke the
 // operation described in the audit log.
 type CallerIdentity struct {
-	CallerDisplayName   string             `json:"CallerDisplayName,omitempty"`
-	CallerIdentityType  CallerIdentityType `json:"CallerIdentityType"`
-	CallerIdentityValue string             `json:"CallerIdentityValue"`
-	CallerIPAddress     string             `json:"CallerIpAddress,omitempty"`
+	CallerDisplayName   string `json:"CallerDisplayName,omitempty"`
+	CallerIdentityType  string `json:"CallerIdentityType"`
+	CallerIdentityValue string `json:"CallerIdentityValue"`
+	CallerIPAddress     string `json:"CallerIpAddress,omitempty"`
 }
 
-// CallerIdentityType represents the type of identity used in an auditable event.
-type CallerIdentityType string
-
-// Category provides information for the category of the operation.
-type Category string
-
 // Result provides information on the result of the operation.
 type Result struct {
 	ResultType        string `json:"ResultType"`
 	ResultDescription string `json:"ResultDescription,omitempty"`
 }
 
-// ResultType indicates the outcome of the operation.
-type ResultType string
-
 // TargetResource has identity information on the entity affected by the
 // operation described in the audit log.
 type TargetResource struct {
@@ -103,4 +94,5 @@ const (
 	ResultTypeFail        = "Fail"
 	ResultTypeTimeout     = "Timeout"
 	ResultTypeClientError = "Client Error"
+	ResultTypeUnknown     = "Unknown"
 )
diff --git a/pkg/util/log/log.go b/pkg/util/log/log.go
index ff2a58535..c255c59fa 100644
--- a/pkg/util/log/log.go
+++ b/pkg/util/log/log.go
@@ -16,6 +16,7 @@ import (
 	"github.com/sirupsen/logrus"
 
 	"github.com/Azure/ARO-RP/pkg/api"
+	"github.com/Azure/ARO-RP/pkg/util/log/audit"
 	"github.com/Azure/ARO-RP/pkg/util/stringutils"
 )
 
@@ -26,10 +27,16 @@ var (
 
 	loglevel = flag.String("loglevel", "info", "{panic,fatal,error,warning,info,debug,trace}")
 
-	rxTolerantResourceID = regexp.MustCompile(`(?i)^(?:/admin)?/subscriptions/([^/]+)(?:/resourceGroups/([^/]+)(?:/providers/([^/]+)/([^/]+)(?:/([^/]+))?)?)?`)
+	// matches URLs that look like /subscriptions/%s/providers/%s/%s
+	RXProviderResourceKind = regexp.MustCompile(`^/subscriptions/([^/]+)/providers/([^/]+)/([^/]+)$`)
+
+	// matches URLs that look like /admin/providers/%s/%s
+	RXAdminProvider = regexp.MustCompile(`^/admin/providers/([^/]+)/([^/]+)$`)
+
+	RXTolerantResourceID = regexp.MustCompile(`(?i)^(?:/admin)?/subscriptions/([^/]+)(?:/resourceGroups/([^/]+)(?:/providers/([^/]+)/([^/]+)(?:/([^/]+))?)?)?`)
 )
 
-func GetBaseLogger() *logrus.Logger {
+func getBaseLogger() *logrus.Logger {
 	logger := logrus.New()
 
 	logger.SetFormatter(&logrus.TextFormatter{
@@ -43,9 +50,16 @@ func GetBaseLogger() *logrus.Logger {
 	return logger
 }
 
+// GetAuditEntry returns a consistently configured audit log entry
+func GetAuditEntry() *logrus.Entry {
+	auditLogger := getBaseLogger()
+	audit.AddHook(auditLogger)
+	return logrus.NewEntry(auditLogger)
+}
+
 // GetLogger returns a consistently configured log entry
 func GetLogger() *logrus.Entry {
-	logger := GetBaseLogger()
+	logger := getBaseLogger()
 
 	logger.SetReportCaller(true)
 	logger.SetFormatter(&logrus.TextFormatter{
@@ -70,7 +84,7 @@ func GetLogger() *logrus.Entry {
 // EnrichWithPath parses the URL path for part or all of an Azure resource ID
 // and sets log fields accordingly
 func EnrichWithPath(log *logrus.Entry, path string) *logrus.Entry {
-	m := rxTolerantResourceID.FindStringSubmatch(path)
+	m := RXTolerantResourceID.FindStringSubmatch(path)
 	if m == nil {
 		return log
 	}


Test patch:
diff --git a/pkg/cluster/install_test.go b/pkg/cluster/install_test.go
index fa2174f9a..5aef2fd48 100644
--- a/pkg/cluster/install_test.go
+++ b/pkg/cluster/install_test.go
@@ -27,7 +27,9 @@ import (
 
 	"github.com/Azure/ARO-RP/pkg/api"
 	"github.com/Azure/ARO-RP/pkg/util/arm"
+	"github.com/Azure/ARO-RP/pkg/util/deployment"
 	mock_features "github.com/Azure/ARO-RP/pkg/util/mocks/azureclient/mgmt/features"
+	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
 	"github.com/Azure/ARO-RP/pkg/util/steps"
 	"github.com/Azure/ARO-RP/pkg/util/version"
 	testdatabase "github.com/Azure/ARO-RP/test/database"
@@ -147,9 +149,16 @@ func TestStepRunnerWithInstaller(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().DeploymentMode().Return(deployment.Production)
+
 			h, log := testlog.New()
 			m := &manager{
 				log:           log,
+				env:           env,
 				kubernetescli: tt.kubernetescli,
 				configcli:     tt.configcli,
 				operatorcli:   tt.operatorcli,
diff --git a/pkg/frontend/admin_openshiftcluster_kubernetesobjects_test.go b/pkg/frontend/admin_openshiftcluster_kubernetesobjects_test.go
index c0e23031d..9b9e3419d 100644
--- a/pkg/frontend/admin_openshiftcluster_kubernetesobjects_test.go
+++ b/pkg/frontend/admin_openshiftcluster_kubernetesobjects_test.go
@@ -174,7 +174,7 @@ func TestAdminKubernetesObjectsGetAndDelete(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.KubeActions, error) {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.KubeActions, error) {
 				return k, nil
 			}, nil, nil)
 			if err != nil {
@@ -368,7 +368,7 @@ func TestAdminPostKubernetesObjects(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.KubeActions, error) {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.KubeActions, error) {
 				return k, nil
 			}, nil, nil)
 			if err != nil {
diff --git a/pkg/frontend/admin_openshiftcluster_list_test.go b/pkg/frontend/admin_openshiftcluster_list_test.go
index 9815911ba..fd3960d75 100644
--- a/pkg/frontend/admin_openshiftcluster_list_test.go
+++ b/pkg/frontend/admin_openshiftcluster_list_test.go
@@ -123,7 +123,7 @@ func TestAdminListOpenShiftCluster(t *testing.T) {
 				ti.openShiftClustersClient.SetError(tt.throwsError)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, aead, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, aead, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
 				return ti.enricher
 			})
 			if err != nil {
diff --git a/pkg/frontend/admin_openshiftcluster_redeployvm_test.go b/pkg/frontend/admin_openshiftcluster_redeployvm_test.go
index 6467c1f74..91f227578 100644
--- a/pkg/frontend/admin_openshiftcluster_redeployvm_test.go
+++ b/pkg/frontend/admin_openshiftcluster_redeployvm_test.go
@@ -84,7 +84,7 @@ func TestAdminRedeployVM(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.AzureActions, error) {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.AzureActions, error) {
 				return a, nil
 			}, nil)
 
diff --git a/pkg/frontend/admin_openshiftcluster_resources_list_test.go b/pkg/frontend/admin_openshiftcluster_resources_list_test.go
index bce4f902c..e70ace06b 100644
--- a/pkg/frontend/admin_openshiftcluster_resources_list_test.go
+++ b/pkg/frontend/admin_openshiftcluster_resources_list_test.go
@@ -88,7 +88,7 @@ func TestAdminListResourcesList(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.AzureActions, error) {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, func(*logrus.Entry, env.Interface, *api.OpenShiftCluster, *api.SubscriptionDocument) (adminactions.AzureActions, error) {
 				return a, nil
 			}, nil)
 
diff --git a/pkg/frontend/adminactions/upgrade_test.go b/pkg/frontend/adminactions/upgrade_test.go
index f924c1131..cca3c8a30 100644
--- a/pkg/frontend/adminactions/upgrade_test.go
+++ b/pkg/frontend/adminactions/upgrade_test.go
@@ -239,7 +239,7 @@ func TestCheckCustomDNS(t *testing.T) {
 						},
 					}, nil)
 			},
-			wantErr: "not upgrading: custom DNS is set",
+			wantErr: "500: InternalServerError: : Not upgrading: custom DNS is set.",
 		},
 	}
 	for _, tt := range tests {
diff --git a/pkg/frontend/asyncoperationresult_get_test.go b/pkg/frontend/asyncoperationresult_get_test.go
index f157c3c35..378d749bb 100644
--- a/pkg/frontend/asyncoperationresult_get_test.go
+++ b/pkg/frontend/asyncoperationresult_get_test.go
@@ -122,7 +122,7 @@ func TestGetAsyncOperationResult(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
 			if err != nil {
 				t.Fatal(err)
 			}
diff --git a/pkg/frontend/asyncoperationsstatus_get_test.go b/pkg/frontend/asyncoperationsstatus_get_test.go
index bc05f2e6d..d5cee0efc 100644
--- a/pkg/frontend/asyncoperationsstatus_get_test.go
+++ b/pkg/frontend/asyncoperationsstatus_get_test.go
@@ -160,7 +160,7 @@ func TestGetAsyncOperationsStatus(t *testing.T) {
 				ti.asyncOperationsClient.SetError(tt.dbError)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
 			if err != nil {
 				t.Fatal(err)
 			}
diff --git a/pkg/frontend/middleware/log_test.go b/pkg/frontend/middleware/log_test.go
new file mode 100644
index 000000000..cc9c0a37f
--- /dev/null
+++ b/pkg/frontend/middleware/log_test.go
@@ -0,0 +1,147 @@
+package middleware
+
+// Copyright (c) Microsoft Corporation.
+// Licensed under the Apache License 2.0.
+
+import (
+	"fmt"
+	"net/http"
+	"net/url"
+	"testing"
+)
+
+func TestAuditTargetResourceData(t *testing.T) {
+	var (
+		location                  = "test-location"
+		resourceGroupName         = "test-resource-group-name"
+		resourceProviderNamespace = "test-resource-provider-namespace"
+		resourceName              = "test-resource-name"
+		resourceType              = "test-resource-type"
+		subscriptionID            = "test-subscription"
+		operationID               = "test-operation-id"
+	)
+
+	var testCases = []struct {
+		url          string
+		expectedKind string
+		expectedName string
+	}{
+		{
+			url:          "/healthz/ready",
+			expectedKind: "",
+			expectedName: "",
+		},
+		{
+			url:          fmt.Sprintf("/subscriptions/%s/resourcegroups/%s/providers/%s/%s/%s", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType, resourceName),
+			expectedKind: resourceType,
+			expectedName: resourceName,
+		},
+		{
+			url:          fmt.Sprintf("/subscriptions/%s/resourcegroups/%s/providers/%s/%s", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType),
+			expectedKind: resourceType,
+		},
+		{
+			url:          fmt.Sprintf("/subscriptions/%s/providers/%s/%s", subscriptionID, resourceProviderNamespace, resourceType),
+			expectedKind: resourceType,
+		},
+		{
+			url:          fmt.Sprintf("/subscriptions/%s/providers/%s/locations/%s/operationsstatus/%s", subscriptionID, resourceProviderNamespace, location, operationID),
+			expectedKind: "",
+			expectedName: "",
+		},
+		{
+			url:          fmt.Sprintf("/subscriptions/%s/providers/%s/locations/%s/operationresults/%s", subscriptionID, resourceProviderNamespace, location, operationID),
+			expectedKind: "",
+			expectedName: "",
+		},
+		{
+			url:          fmt.Sprintf("/subscriptions/%s/resourcegroups/%s/providers/%s/%s/%s/listcredentials", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType, resourceName),
+			expectedKind: resourceType,
+			expectedName: resourceName,
+		},
+		{
+			url:          fmt.Sprintf("/admin/subscriptions/%s/resourcegroups/%s/providers/%s/%s/%s/kubernetesobjects", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType, resourceName),
+			expectedKind: resourceType,
+			expectedName: resourceName,
+		},
+		{
+			url:          fmt.Sprintf("/admin/subscriptions/%s/resourcegroups/%s/providers/%s/%s/%s/resources", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType, resourceName),
+			expectedKind: resourceType,
+			expectedName: resourceName,
+		},
+		{
+			url:          fmt.Sprintf("/admin/subscriptions/%s/resourcegroups/%s/providers/%s/%s/%s/serialconsole", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType, resourceName),
+			expectedKind: resourceType,
+			expectedName: resourceName,
+		},
+		{
+			url:          fmt.Sprintf("/admin/subscriptions/%s/resourcegroups/%s/providers/%s/%s/%s/redeployvm", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType, resourceName),
+			expectedKind: resourceType,
+			expectedName: resourceName,
+		},
+		{
+			url:          fmt.Sprintf("/admin/subscriptions/%s/resourcegroups/%s/providers/%s/%s/%s/upgrade", subscriptionID, resourceGroupName, resourceProviderNamespace, resourceType, resourceName),
+			expectedKind: resourceType,
+			expectedName: resourceName,
+		},
+		{
+			url:          fmt.Sprintf("/admin/providers/%s/%s", resourceProviderNamespace, resourceType),
+			expectedKind: resourceType,
+			expectedName: "",
+		},
+		{
+			url:          fmt.Sprintf("/providers/%s/operations", resourceProviderNamespace),
+			expectedKind: "",
+			expectedName: "",
+		},
+		{
+			url:          fmt.Sprintf("/subscriptions/%s", subscriptionID),
+			expectedKind: "",
+			expectedName: "",
+		},
+	}
+
+	for _, tc := range testCases {
+		parsedURL, err := url.Parse(tc.url)
+		if err != nil {
+			t.Fatal("unexpected error: ", err)
+		}
+
+		request := &http.Request{URL: parsedURL}
+		actualKind, actualName := auditTargetResourceData(request)
+		if tc.expectedKind != actualKind {
+			t.Errorf("%s: expected %s, actual: %s", tc.url, tc.expectedKind, actualKind)
+		}
+
+		if tc.expectedName != actualName {
+			t.Errorf("%s: expected %s, actual: %s", tc.url, tc.expectedName, actualName)
+		}
+	}
+}
+
+func TestIsAdminOp(t *testing.T) {
+	var testCases = []struct {
+		url      string
+		expected bool
+	}{
+		{url: "", expected: false},
+		{url: "/", expected: false},
+		{url: "/foo", expected: false},
+		{url: "/foo/bar", expected: false},
+		{url: "/admin", expected: true},
+		{url: "/admin/foo", expected: true},
+	}
+
+	for _, tc := range testCases {
+		parsedURL, err := url.Parse(tc.url)
+		if err != nil {
+			t.Fatal("unexpected error: ", err)
+		}
+
+		r := &http.Request{URL: parsedURL}
+		if actual := isAdminOp(r); tc.expected != actual {
+			t.Errorf("%s: expected: %t, actual: %t", tc.url, tc.expected, actual)
+		}
+	}
+
+}
diff --git a/pkg/frontend/openshiftcluster_delete_test.go b/pkg/frontend/openshiftcluster_delete_test.go
index ee5048e37..718971e72 100644
--- a/pkg/frontend/openshiftcluster_delete_test.go
+++ b/pkg/frontend/openshiftcluster_delete_test.go
@@ -114,7 +114,7 @@ func TestDeleteOpenShiftCluster(t *testing.T) {
 				ti.subscriptionsClient.SetError(tt.dbError)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
 			if err != nil {
 				t.Fatal(err)
 			}
diff --git a/pkg/frontend/openshiftcluster_get_test.go b/pkg/frontend/openshiftcluster_get_test.go
index 65684cd12..a959eb59e 100644
--- a/pkg/frontend/openshiftcluster_get_test.go
+++ b/pkg/frontend/openshiftcluster_get_test.go
@@ -97,7 +97,7 @@ func TestGetOpenShiftCluster(t *testing.T) {
 				ti.openShiftClustersClient.SetError(tt.dbError)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
 				return ti.enricher
 			})
 			if err != nil {
diff --git a/pkg/frontend/openshiftcluster_list_test.go b/pkg/frontend/openshiftcluster_list_test.go
index 415b237c8..817de0c7e 100644
--- a/pkg/frontend/openshiftcluster_list_test.go
+++ b/pkg/frontend/openshiftcluster_list_test.go
@@ -198,7 +198,7 @@ func TestListOpenShiftCluster(t *testing.T) {
 
 					aead := testdatabase.NewFakeAEAD()
 
-					f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, aead, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
+					f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, aead, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
 						return ti.enricher
 					})
 					if err != nil {
diff --git a/pkg/frontend/openshiftcluster_putorpatch_test.go b/pkg/frontend/openshiftcluster_putorpatch_test.go
index 97b8d8827..8e4b361b4 100644
--- a/pkg/frontend/openshiftcluster_putorpatch_test.go
+++ b/pkg/frontend/openshiftcluster_putorpatch_test.go
@@ -209,7 +209,7 @@ func TestPutOrPatchOpenShiftClusterAdminAPI(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, apis, &noop.Noop{}, nil, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, apis, &noop.Noop{}, nil, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
 				return ti.enricher
 			})
 			if err != nil {
@@ -881,7 +881,7 @@ func TestPutOrPatchOpenShiftCluster(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, apis, &noop.Noop{}, nil, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, apis, &noop.Noop{}, nil, nil, nil, func(log *logrus.Entry, dialer proxy.Dialer, m metrics.Interface) clusterdata.OpenShiftClusterEnricher {
 				return ti.enricher
 			})
 			if err != nil {
diff --git a/pkg/frontend/openshiftclustercredentials_post_test.go b/pkg/frontend/openshiftclustercredentials_post_test.go
index 7fb3fa752..8a8a835c0 100644
--- a/pkg/frontend/openshiftclustercredentials_post_test.go
+++ b/pkg/frontend/openshiftclustercredentials_post_test.go
@@ -266,7 +266,7 @@ func TestPostOpenShiftClusterCredentials(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, apis, &noop.Noop{}, nil, nil, nil, nil)
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, apis, &noop.Noop{}, nil, nil, nil, nil)
 			if err != nil {
 				t.Fatal(err)
 			}
diff --git a/pkg/frontend/security_test.go b/pkg/frontend/security_test.go
index 45bbce323..36c779139 100644
--- a/pkg/frontend/security_test.go
+++ b/pkg/frontend/security_test.go
@@ -12,6 +12,7 @@ import (
 	"testing"
 	"time"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/golang/mock/gomock"
 	"github.com/sirupsen/logrus"
 
@@ -20,10 +21,12 @@ import (
 	"github.com/Azure/ARO-RP/pkg/metrics/noop"
 	"github.com/Azure/ARO-RP/pkg/util/clientauthorizer"
 	"github.com/Azure/ARO-RP/pkg/util/deployment"
+	"github.com/Azure/ARO-RP/pkg/util/log/audit"
 	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"
+	testlog "github.com/Azure/ARO-RP/test/util/log"
 )
 
 func TestSecurity(t *testing.T) {
@@ -55,6 +58,9 @@ func TestSecurity(t *testing.T) {
 
 	_env := mock_env.NewMockInterface(controller)
 	_env.EXPECT().DeploymentMode().AnyTimes().Return(deployment.Production)
+	_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
+	_env.EXPECT().Hostname().AnyTimes().Return("testhost")
+	_env.EXPECT().Location().AnyTimes().Return("eastus")
 	_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))
@@ -68,7 +74,9 @@ func TestSecurity(t *testing.T) {
 	pool := x509.NewCertPool()
 	pool.AddCert(servercerts[0])
 
-	f, err := NewFrontend(ctx, logrus.NewEntry(logrus.StandardLogger()), _env, nil, nil, nil, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
+	log := logrus.NewEntry(logrus.StandardLogger())
+	auditHook, auditEntry := testlog.NewAudit()
+	f, err := NewFrontend(ctx, auditEntry, log, _env, nil, nil, nil, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -77,11 +85,12 @@ func TestSecurity(t *testing.T) {
 	go f.Run(ctx, nil, nil)
 
 	for _, tt := range []struct {
-		name           string
-		url            string
-		key            *rsa.PrivateKey
-		cert           *x509.Certificate
-		wantStatusCode int
+		name              string
+		url               string
+		key               *rsa.PrivateKey
+		cert              *x509.Certificate
+		wantStatusCode    int
+		wantAuditPayloads []*audit.Payload
 	}{
 		{
 			name:           "empty url, no client certificate",
@@ -97,16 +106,118 @@ func TestSecurity(t *testing.T) {
 			name:           "operations url, no client certificate",
 			url:            "https://server/providers/Microsoft.RedHatOpenShift/operations?api-version=2020-04-30",
 			wantStatusCode: http.StatusForbidden,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Fail",
+						ResultDescription: "Status code: 403",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "admin operations url, no client certificate",
 			url:            "https://server/providers/Microsoft.RedHatOpenShift/operations?api-version=admin",
 			wantStatusCode: http.StatusForbidden,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Fail",
+						ResultDescription: "Status code: 403",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "ready url, no client certificate",
 			url:            "https://server/healthz/ready",
 			wantStatusCode: http.StatusOK,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /healthz/ready",
+					Result: audit.Result{
+						ResultType:        "Success",
+						ResultDescription: "Status code: 200",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "empty url, invalid certificate",
@@ -128,6 +239,40 @@ func TestSecurity(t *testing.T) {
 			key:            invalidclientkey,
 			cert:           invalidclientcerts[0],
 			wantStatusCode: http.StatusForbidden,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Fail",
+						ResultDescription: "Status code: 403",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "admin operations url, invalid certificate",
@@ -135,6 +280,40 @@ func TestSecurity(t *testing.T) {
 			key:            invalidclientkey,
 			cert:           invalidclientcerts[0],
 			wantStatusCode: http.StatusForbidden,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Fail",
+						ResultDescription: "Status code: 403",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "ready url, invalid certificate",
@@ -142,6 +321,40 @@ func TestSecurity(t *testing.T) {
 			key:            invalidclientkey,
 			cert:           invalidclientcerts[0],
 			wantStatusCode: http.StatusOK,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /healthz/ready",
+					Result: audit.Result{
+						ResultType:        "Success",
+						ResultDescription: "Status code: 200",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "empty url, valid certificate",
@@ -177,6 +390,40 @@ func TestSecurity(t *testing.T) {
 			key:            validclientkey,
 			cert:           validclientcerts[0],
 			wantStatusCode: http.StatusOK,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Success",
+						ResultDescription: "Status code: 200",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "operations url, valid admin certificate",
@@ -184,6 +431,40 @@ func TestSecurity(t *testing.T) {
 			key:            validadminclientkey,
 			cert:           validadminclientcerts[0],
 			wantStatusCode: http.StatusForbidden,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Fail",
+						ResultDescription: "Status code: 403",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "admin operations url, valid admin certificate",
@@ -191,6 +472,40 @@ func TestSecurity(t *testing.T) {
 			key:            validadminclientkey,
 			cert:           validadminclientcerts[0],
 			wantStatusCode: http.StatusOK,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Success",
+						ResultDescription: "Status code: 200",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "admin operations url, valid non-admin certificate",
@@ -198,6 +513,40 @@ func TestSecurity(t *testing.T) {
 			key:            validclientkey,
 			cert:           validclientcerts[0],
 			wantStatusCode: http.StatusForbidden,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /providers/microsoft.redhatopenshift/operations",
+					Result: audit.Result{
+						ResultType:        "Fail",
+						ResultDescription: "Status code: 403",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "ready url, valid certificate",
@@ -205,6 +554,40 @@ func TestSecurity(t *testing.T) {
 			key:            validclientkey,
 			cert:           validclientcerts[0],
 			wantStatusCode: http.StatusOK,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /healthz/ready",
+					Result: audit.Result{
+						ResultType:        "Success",
+						ResultDescription: "Status code: 200",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 		{
 			name:           "ready url, valid admin certificate",
@@ -212,6 +595,40 @@ func TestSecurity(t *testing.T) {
 			key:            validadminclientkey,
 			cert:           validadminclientcerts[0],
 			wantStatusCode: http.StatusOK,
+			wantAuditPayloads: []*audit.Payload{
+				{
+					EnvVer:               audit.IFXAuditVersion,
+					EnvName:              audit.IFXAuditName,
+					EnvFlags:             257,
+					EnvAppID:             audit.SourceRP,
+					EnvCloudName:         _env.Environment().Name,
+					EnvCloudRole:         audit.CloudRoleRP,
+					EnvCloudRoleInstance: _env.Hostname(),
+					EnvCloudEnvironment:  _env.Environment().Name,
+					EnvCloudLocation:     _env.Location(),
+					EnvCloudVer:          audit.IFXAuditCloudVer,
+					CallerIdentities: []audit.CallerIdentity{
+						{
+							CallerDisplayName:   "",
+							CallerIdentityType:  "ApplicationID",
+							CallerIdentityValue: "Go-http-client/1.1",
+							CallerIPAddress:     "bufferedpipe",
+						},
+					},
+					Category:      "ResourceManagement",
+					OperationName: "GET /healthz/ready",
+					Result: audit.Result{
+						ResultType:        "Success",
+						ResultDescription: "Status code: 200",
+					},
+					TargetResources: []audit.TargetResource{
+						{
+							TargetResourceType: "",
+							TargetResourceName: "",
+						},
+					},
+				},
+			},
 		},
 	} {
 		t.Run(tt.name, func(t *testing.T) {
@@ -245,6 +662,9 @@ func TestSecurity(t *testing.T) {
 			if resp.StatusCode != tt.wantStatusCode {
 				t.Error(resp.StatusCode)
 			}
+
+			testlog.AssertAuditPayloads(t, auditHook, tt.wantAuditPayloads)
+			auditHook.Entries = []logrus.Entry{}
 		})
 	}
 }
diff --git a/pkg/frontend/shared_test.go b/pkg/frontend/shared_test.go
index b90a5aaa9..452898a94 100644
--- a/pkg/frontend/shared_test.go
+++ b/pkg/frontend/shared_test.go
@@ -16,6 +16,7 @@ import (
 	"reflect"
 	"testing"
 
+	"github.com/Azure/go-autorest/autorest/azure"
 	"github.com/go-test/deep"
 	"github.com/golang/mock/gomock"
 	"github.com/sirupsen/logrus"
@@ -32,6 +33,7 @@ import (
 	testdatabase "github.com/Azure/ARO-RP/test/database"
 	testclusterdata "github.com/Azure/ARO-RP/test/util/clusterdata"
 	"github.com/Azure/ARO-RP/test/util/listener"
+	testlog "github.com/Azure/ARO-RP/test/util/log"
 )
 
 var (
@@ -61,6 +63,7 @@ type testInfra struct {
 	l          net.Listener
 	cli        *http.Client
 	enricher   testclusterdata.TestEnricher
+	audit      *logrus.Entry
 	log        *logrus.Entry
 	fixture    *testdatabase.Fixture
 	checker    *testdatabase.Checker
@@ -88,6 +91,8 @@ func newTestInfra(t *testing.T) *testInfra {
 
 	_env := mock_env.NewMockInterface(controller)
 	_env.EXPECT().DeploymentMode().AnyTimes().Return(deployment.Production)
+	_env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
+	_env.EXPECT().Hostname().AnyTimes().Return("testhost")
 	_env.EXPECT().Location().AnyTimes().Return("eastus")
 	_env.EXPECT().ServiceKeyvault().AnyTimes().Return(keyvault)
 	_env.EXPECT().ArmClientAuthorizer().AnyTimes().Return(clientauthorizer.NewOne(clientcerts[0].Raw))
@@ -95,6 +100,7 @@ func newTestInfra(t *testing.T) *testInfra {
 	_env.EXPECT().Domain().AnyTimes().Return("")
 	_env.EXPECT().Listen().AnyTimes().Return(l, nil)
 
+	_, auditEntry := testlog.NewAudit()
 	log := logrus.NewEntry(logrus.StandardLogger())
 
 	fixture := testdatabase.NewFixture()
@@ -109,6 +115,7 @@ func newTestInfra(t *testing.T) *testInfra {
 		enricher:   testclusterdata.NewTestEnricher(),
 		fixture:    fixture,
 		checker:    checker,
+		audit:      auditEntry,
 		log:        log,
 		cli: &http.Client{
 			Transport: &http.Transport{
diff --git a/pkg/frontend/subscriptions_put_test.go b/pkg/frontend/subscriptions_put_test.go
index 7fa16dd45..807841104 100644
--- a/pkg/frontend/subscriptions_put_test.go
+++ b/pkg/frontend/subscriptions_put_test.go
@@ -244,7 +244,7 @@ func TestPutSubscription(t *testing.T) {
 				t.Fatal(err)
 			}
 
-			f, err := NewFrontend(ctx, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
+			f, err := NewFrontend(ctx, ti.audit, ti.log, ti.env, ti.asyncOperationsDatabase, ti.openShiftClustersDatabase, ti.subscriptionsDatabase, api.APIs, &noop.Noop{}, nil, nil, nil, nil)
 			if err != nil {
 				t.Fatal(err)
 			}
diff --git a/pkg/util/log/audit/audit_test.go b/pkg/util/log/audit/audit_test.go
deleted file mode 100644
index f62655dbd..000000000
--- a/pkg/util/log/audit/audit_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package audit
-
-// Copyright (c) Microsoft Corporation.
-// Licensed under the Apache License 2.0.
-
-import (
-	"testing"
-	"time"
-
-	"github.com/Azure/go-autorest/autorest/azure"
-	"github.com/golang/mock/gomock"
-	"github.com/onsi/gomega"
-	"github.com/onsi/gomega/types"
-	uuid "github.com/satori/go.uuid"
-	"github.com/sirupsen/logrus"
-	"github.com/sirupsen/logrus/hooks/test"
-
-	mock_env "github.com/Azure/ARO-RP/pkg/util/mocks/env"
-	utillog "github.com/Azure/ARO-RP/test/util/log"
-)
-
-func TestAudit(t *testing.T) {
-	controller := gomock.NewController(t)
-	defer controller.Finish()
-
-	env := mock_env.NewMockInterface(controller)
-	env.EXPECT().Environment().AnyTimes().Return(&azure.PublicCloud)
-	env.EXPECT().Location().AnyTimes().Return("eastus")
-	env.EXPECT().Hostname().AnyTimes().Return("test-host")
-
-	epoch = uuid.NewV4().String()
-	var (
-		now          = time.Now().UTC()
-		formattedNow = now.Format(time.RFC3339)
-		logger, h    = test.NewNullLogger()
-	)
-
-	auditLog := NewEntry(env, logger)
-	auditLog.WithFields(logrus.Fields{
-		PayloadKeyCategory:      CategoryAuthorization,
-		PayloadKeyOperationName: "initializeAuthorizers",
-		MetadataSource:          SourceRP,
-		MetadataCreatedTime:     formattedNow,
-	}).Print("see auditFullPayload field for full log data")
-
-	if err := utillog.AssertLoggingOutput(h, []map[string]types.GomegaMatcher{
-		{
-			"level":         gomega.Equal(logrus.InfoLevel),
-			"msg":           gomega.Equal("see auditFullPayload field for full log data"),
-			MetadataSource:  gomega.Equal("aro-rp"),
-			MetadataLogKind: gomega.Equal("ifxaudit"),
-			MetadataCreatedTime: gomega.WithTransform(
-				func(s string) time.Time {
-					t, err := time.Parse(time.RFC3339, s)
-					if err != nil {
-						panic(err)
-					}
-					return t
-				},
-				gomega.BeTemporally("~", now, time.Second),
-			),
-			MetadataPayload: gomega.Equal(`{"env_ver":2.1,"env_name":"#Ifx.AuditSchema","env_time":"` + formattedNow + `","env_epoch":"` + epoch + `","env_seqNum":1,"env_flags":257,"env_appId":"","env_cloud_name":"AzurePublicCloud","env_cloud_role":"","env_cloud_roleInstance":"test-host","env_cloud_environment":"AzurePublicCloud","env_cloud_location":"eastus","env_cloud_ver":1,"CallerIdentities":null,"Category":"Authorization","OperationName":"initializeAuthorizers","Result":null,"requestId":"","TargetResources":null}`),
-		},
-	}); err != nil {
-		t.Error(err)
-	}
-}
diff --git a/test/e2e/operator.go b/test/e2e/operator.go
index a8e002646..218334c95 100644
--- a/test/e2e/operator.go
+++ b/test/e2e/operator.go
@@ -256,3 +256,23 @@ var _ = Describe("ARO Operator - RBAC", func() {
 		Expect(err).NotTo(HaveOccurred())
 	})
 })
+
+var _ = Describe("ARO Operator - All conditions valid", func() {
+	Specify("All condition should not be failing", func() {
+		clusterOperatorConditionsValid := func() (bool, error) {
+			co, err := clients.AROClusters.AroV1alpha1().Clusters().Get(context.Background(), "cluster", metav1.GetOptions{})
+			Expect(err).NotTo(HaveOccurred())
+
+			valid := true
+			for _, condition := range arov1alpha1.AllConditionTypes() {
+				if !co.Status.Conditions.IsTrueFor(condition) {
+					valid = false
+				}
+			}
+			return valid, nil
+		}
+
+		err := wait.PollImmediate(30*time.Second, 15*time.Minute, clusterOperatorConditionsValid)
+		Expect(err).NotTo(HaveOccurred())
+	})
+})
diff --git a/test/e2e/setup.go b/test/e2e/setup.go
index 574fdd771..97354e6df 100644
--- a/test/e2e/setup.go
+++ b/test/e2e/setup.go
@@ -156,7 +156,10 @@ func setup(ctx context.Context) error {
 		return err
 	}
 
-	vnetResourceGroup = os.Getenv("CLUSTER")
+	vnetResourceGroup = os.Getenv("RESOURCEGROUP") // TODO: remove this when we deploy and peer a vnet per cluster create
+	if os.Getenv("CI") != "" {
+		vnetResourceGroup = os.Getenv("CLUSTER")
+	}
 	clusterName = os.Getenv("CLUSTER")
 
 	if os.Getenv("CI") != "" { // always create cluster in CI
diff --git a/test/util/log/log.go b/test/util/log/log.go
index 9d964be36..63ba3bd42 100644
--- a/test/util/log/log.go
+++ b/test/util/log/log.go
@@ -4,12 +4,17 @@ package log
 // Licensed under the Apache License 2.0.
 
 import (
+	"encoding/json"
 	"fmt"
+	"reflect"
 	"strings"
+	"testing"
 
 	"github.com/onsi/gomega/types"
 	"github.com/sirupsen/logrus"
 	"github.com/sirupsen/logrus/hooks/test"
+
+	"github.com/Azure/ARO-RP/pkg/util/log/audit"
 )
 
 // New creates a logging hook and entry suitable for passing to functions and
@@ -20,23 +25,34 @@ func New() (*test.Hook, *logrus.Entry) {
 	return h, log
 }
 
+// NewAudit creates a logging hook and entry suitable for testing the IFXAudit
+// feature.
+func NewAudit() (*test.Hook, *logrus.Entry) {
+	logger, h := test.NewNullLogger()
+	audit.AddHook(logger)
+	return h, logrus.NewEntry(logger)
+}
+
 // AssertLoggingOutput compares the logs on `h` with the expected entries in
 // `expected`. It returns a slice of errors encountered, with a zero length if
 // no assertions failed.
 func AssertLoggingOutput(h *test.Hook, expected []map[string]types.GomegaMatcher) error {
-	var problems []string
+	var (
+		problems []string
+		entries  = h.Entries
+	)
 
-	if len(h.Entries) != len(expected) {
-		problems = append(problems, fmt.Sprintf("got %d logs, expected %d", len(h.Entries), len(expected)))
+	if len(entries) != len(expected) {
+		problems = append(problems, fmt.Sprintf("got %d logs, expected %d", len(entries), len(expected)))
 	} else {
 		for i, m := range expected {
 			for k, matcher := range m {
-				v := h.Entries[i].Data[k]
+				v := entries[i].Data[k]
 				switch k {
 				case "level":
-					v = h.Entries[i].Level
+					v = entries[i].Level
 				case "msg":
-					v = h.Entries[i].Message
+					v = entries[i].Message
 				}
 				ok, err := matcher.Match(v)
 				if err != nil {
@@ -49,15 +65,103 @@ func AssertLoggingOutput(h *test.Hook, expected []map[string]types.GomegaMatcher
 	}
 
 	if len(problems) > 0 {
-		entries := make([]string, 0, len(h.Entries))
+		formatted := make([]string, 0, len(entries))
 
-		for _, entry := range h.Entries {
+		for _, entry := range entries {
 			b, _ := entry.Logger.Formatter.Format(&entry)
-			entries = append(entries, string(b))
+			formatted = append(formatted, string(b))
 		}
 
-		return fmt.Errorf("logging mismatch:\ngot:\n%s\nproblems:\n%s", strings.Join(entries, ""), strings.Join(problems, "\n"))
+		return fmt.Errorf("logging mismatch:\ngot:\n%s\nproblems:\n%s", strings.Join(formatted, ""), strings.Join(problems, "\n"))
 	}
 
 	return nil
 }
+
+// AssertAuditPayload compares the audit payloads in `h` with the given expected
+// payloads
+func AssertAuditPayloads(t *testing.T, h *test.Hook, expected []*audit.Payload) {
+	if len(expected) != len(h.AllEntries()) {
+		t.Errorf("mismatch entries count: expected: %d, actual: %d", len(expected), len(h.AllEntries()))
+		return
+	}
+
+	for i, entry := range h.AllEntries() {
+		raw, ok := entry.Data[audit.MetadataPayload].(string)
+		if !ok {
+			t.Error("audit payload type cast failed")
+			return
+		}
+
+		var actual audit.Payload
+		if err := json.Unmarshal([]byte(raw), &actual); err != nil {
+			t.Errorf("fail to unmarshal payload: %s", err)
+			continue
+		}
+
+		errors := []string{}
+		if expected[i].EnvVer != actual.EnvVer {
+			errors = append(errors, fmt.Sprintf("mismatch EnvVer. expected: %.f, actual: %.f", expected[i].EnvVer, actual.EnvVer))
+		}
+
+		if expected[i].EnvName != actual.EnvName {
+			errors = append(errors, fmt.Sprintf("mismatch EnvName. expected: %s, actual: %s", expected[i].EnvName, actual.EnvName))
+		}
+
+		if expected[i].EnvFlags != actual.EnvFlags {
+			errors = append(errors, fmt.Sprintf("mismatch EnvFlags. expected: %d, actual: %d", expected[i].EnvFlags, actual.EnvFlags))
+		}
+
+		if expected[i].EnvAppID != actual.EnvAppID {
+			errors = append(errors, fmt.Sprintf("mismatch EnvAppID. expected: %s, actual: %s", expected[i].EnvAppID, actual.EnvAppID))
+		}
+
+		if expected[i].EnvCloudName != actual.EnvCloudName {
+			errors = append(errors, fmt.Sprintf("mismatch EnvCloudName. expected: %s, actual: %s", expected[i].EnvCloudName, actual.EnvCloudName))
+		}
+
+		if expected[i].EnvCloudRole != actual.EnvCloudRole {
+			errors = append(errors, fmt.Sprintf("mismatch EnvCloudRole. expected: %s, actual: %s", expected[i].EnvCloudRole, actual.EnvCloudRole))
+		}
+
+		if expected[i].EnvCloudRoleInstance != actual.EnvCloudRoleInstance {
+			errors = append(errors, fmt.Sprintf("mismatch EnvCloudRoleInstance. expected: %s, actual: %s", expected[i].EnvCloudRoleInstance, actual.EnvCloudRoleInstance))
+		}
+
+		if expected[i].EnvCloudEnvironment != actual.EnvCloudEnvironment {
+			errors = append(errors, fmt.Sprintf("mismatch EnvCloudEnvironment. expected: %s, actual: %s", expected[i].EnvCloudEnvironment, actual.EnvCloudEnvironment))
+		}
+
+		if expected[i].EnvCloudLocation != actual.EnvCloudLocation {
+			errors = append(errors, fmt.Sprintf("mismatch EnvCloudLocation. expected: %s, actual: %s", expected[i].EnvCloudLocation, actual.EnvCloudLocation))
+		}
+
+		if expected[i].EnvCloudVer != actual.EnvCloudVer {
+			errors = append(errors, fmt.Sprintf("mismatch EnvCloudVer. expected: %.f, actual: %.f", expected[i].EnvCloudVer, actual.EnvCloudVer))
+		}
+
+		if !reflect.DeepEqual(expected[i].CallerIdentities, actual.CallerIdentities) {
+			errors = append(errors, fmt.Sprintf("mismatch CallerIdentities. expected: %+v, actual: %+v", expected[i].CallerIdentities, actual.CallerIdentities))
+		}
+
+		if expected[i].Category != actual.Category {
+			errors = append(errors, fmt.Sprintf("mismatch Category. expected: %s, actual: %s", expected[i].Category, actual.Category))
+		}
+
+		if expected[i].OperationName != actual.OperationName {
+			errors = append(errors, fmt.Sprintf("mismatch OperationName. expected: %s, actual: %s", expected[i].OperationName, actual.OperationName))
+		}
+
+		if !reflect.DeepEqual(expected[i].Result, actual.Result) {
+			errors = append(errors, fmt.Sprintf("mismatch Result. expected: %+v, actual: %+v", expected[i].Result, actual.Result))
+		}
+
+		if !reflect.DeepEqual(expected[i].TargetResources, actual.TargetResources) {
+			errors = append(errors, fmt.Sprintf("mismatch TargetResources. expected: %+v, actual: %+v", expected[i].TargetResources, actual.TargetResources))
+		}
+
+		if len(errors) > 0 {
+			t.Errorf("mismatch payload fields: %s", strings.Join(errors, "\n"))
+		}
+	}
+}