Repository: pulumi/pulumi-terraform-bridge
Pull request #389 (2021-09-17 06:40:14)

Fixed major error in Coverage Tracker
In certain cases, multiple HCL examples all under the same example name are provided to the coverage tracker, which leads to their conversion results being overwritten by eachother and lost. The coverage tracker has been updated to handle such cases, and the exporter has been updated to differentiate between these examples in the resulting JSONs by appending "#[INDEX]" to the example name based on the order it was encountered.

github-actions[bot]: Diff for [pulumi-random](https://github.com/pulumi-bot/pulumi-random/compare/008e69c..4acee55) with merge commit adb6c7a988265bb757a3c6cc8094d75ecf3dee05
github-actions[bot]: Diff for [pulumi-azuread](https://github.com/pulumi-bot/pulumi-azuread/compare/91b8a13..75bdd20) with merge commit adb6c7a988265bb757a3c6cc8094d75ecf3dee05
github-actions[bot]: Diff for [pulumi-gcp](https://github.com/pulumi-bot/pulumi-gcp/compare/34d7d74c7..310040f55) with merge commit adb6c7a988265bb757a3c6cc8094d75ecf3dee05
github-actions[bot]: Diff for [pulumi-aws](https://github.com/pulumi-bot/pulumi-aws/compare/7fcf15a73..3360912c3) with merge commit adb6c7a988265bb757a3c6cc8094d75ecf3dee05
github-actions[bot]: Diff for [pulumi-azure](https://github.com/pulumi-bot/pulumi-azure/compare/80306ae98..4415af662) with merge commit adb6c7a988265bb757a3c6cc8094d75ecf3dee05

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index a0424339..00000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,11 +0,0 @@
-CHANGELOG
-=========
-
-## HEAD (Unreleased)
-* Upgrade to Pulumi v3.12.0 for sdk and pkg
-* Add support for exporting provider example conversion metrics
-
----
-
-## 3.6.0 (2021-08-30)
-* Upgrade to Pulumi v3.11.0 for sdk and pkg
diff --git a/Makefile b/Makefile
index 2db1df2d..60e5530b 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ PROJECT          := github.com/pulumi/pulumi-terraform-bridge
 TESTPARALLELISM  := 10
 
 build::
+	go mod tidy
 	go build ${PROJECT}/v3/pkg/...
 	go build ${PROJECT}/v3/internal/...
 	go install ${PROJECT}/v3/cmd/...
@@ -14,7 +15,7 @@ build::
 lint::
 	golangci-lint run
 
-test_fast::
+test_fast:: build
 	$(GO_TEST) ./...
 
 test_all:: test_fast
diff --git a/README.md b/README.md
index ae2985e0..7c81c8b9 100644
--- a/README.md
+++ b/README.md
@@ -74,9 +74,9 @@ to types and concepts that the bridge will use to generate well-typed programmat
 
 The AWS provider provides a standard blueprint to follow for this.  There are three major elements:
 
-* [`cmd/pulumi-tfgen-aws/`](https://github.com/pulumi/pulumi-aws/tree/master/cmd/pulumi-tfgen-aws)
-* [`cmd/pulumi-resource-aws/`](https://github.com/pulumi/pulumi-aws/tree/master/cmd/pulumi-resource-aws)
-* [`resources.go`](https://github.com/pulumi/pulumi-aws/blob/master/resources.go)
+* [`cmd/pulumi-tfgen-aws/`](https://github.com/pulumi/pulumi-aws/tree/master/provider/cmd/pulumi-tfgen-aws)
+* [`cmd/pulumi-resource-aws/`](https://github.com/pulumi/pulumi-aws/tree/master/provider/cmd/pulumi-resource-aws)
+* [`resources.go`](https://github.com/pulumi/pulumi-aws/blob/master/provider/resources.go)
 
 The [`Makefile`](https://github.com/pulumi/pulumi-aws/blob/master/Makefile) compiles these programs, and notably, uses
 the resulting `pulumi-tfgen-aws` binary to generate code for many different languages.  The resulting generated code is
diff --git a/go.mod b/go.mod
index c72ee609..d3f6b8f5 100644
--- a/go.mod
+++ b/go.mod
@@ -22,7 +22,7 @@ require (
 	github.com/hashicorp/hcl/v2 v2.3.0
 	github.com/hashicorp/hil v0.0.0-20190212132231-97b3a9cdfa93
 	github.com/hashicorp/terraform-plugin-sdk v1.7.0
-	github.com/hashicorp/terraform-plugin-sdk/v2 v2.7.0
+	github.com/hashicorp/terraform-plugin-sdk/v2 v2.8.0
 	github.com/hashicorp/terraform-svchost v0.0.0-20191119180714-d2e4933b9136
 	github.com/json-iterator/go v1.1.9
 	github.com/mitchellh/cli v1.1.2
@@ -33,8 +33,8 @@ require (
 	github.com/mitchellh/mapstructure v1.4.1
 	github.com/mitchellh/reflectwalk v1.0.2
 	github.com/pkg/errors v0.9.1
-	github.com/pulumi/pulumi/pkg/v3 v3.12.0
-	github.com/pulumi/pulumi/sdk/v3 v3.12.0
+	github.com/pulumi/pulumi/pkg/v3 v3.17.0
+	github.com/pulumi/pulumi/sdk/v3 v3.17.0
 	github.com/pulumi/terraform-diff-reader v0.0.0-20201211191010-ad4715e9285e
 	github.com/russross/blackfriday/v2 v2.1.0
 	github.com/spf13/afero v1.2.2
@@ -49,4 +49,4 @@ require (
 	google.golang.org/grpc v1.37.0
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20210629210550-59d24255d71f
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20211019193655-b23eb83463bb
diff --git a/go.sum b/go.sum
index 070566f1..3cd16f72 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,4 @@
 bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
-bazil.org/fuse v0.0.0-20180421153158-65cc252bf669 h1:FNCRpXiquG1aoyqcIWVFmpTSKVcx2bQD38uZZeGtdlw=
 bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
@@ -31,12 +30,9 @@ cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNF
 cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
 cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
 cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA=
 cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ=
 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/firestore v1.5.0 h1:4qNItsmc4GP6UOZPGemmHY4ZfPofVhcaKXsYw9wm9oA=
 cloud.google.com/go/firestore v1.5.0/go.mod h1:c4nNYR1qdq7eaZ+jSc5fonrQN2k3M7sWATcYTiakjEo=
 cloud.google.com/go/logging v1.0.0 h1:kaunpnoEh9L4hu6JUsBa8Y20LBfKnCuDhKUgdZp7oK8=
 cloud.google.com/go/logging v1.0.0/go.mod h1:V1cc3ogwobYzQq5f2R7DS/GvRIrI4FKj01Gs5glwAls=
@@ -44,7 +40,6 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k
 cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
 cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/pubsub v1.10.3 h1:fvaw1yugWIrDjd+ot470LlVRVLFNMIwRL4kR+wUfYIA=
 cloud.google.com/go/pubsub v1.10.3/go.mod h1:FUcc28GpGxxACoklPsE1sCtbkY4Ix+ro7yvw+h82Jn4=
 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
@@ -53,30 +48,22 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 cloud.google.com/go/storage v1.15.0 h1:Ljj+ZXVEhCr/1+4ZhvtteN1ND7UUsNTlduGclLh8GO0=
 cloud.google.com/go/storage v1.15.0/go.mod h1:mjjQMoxxyGH7Jr8K5qrx6N2O0AHsczI61sMNn03GIZI=
-contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9 h1:yxE46rQA0QaqPGqN2UnwXvgCrRqtjR1CsGSWVTRjvv4=
 contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
-contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo=
 contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
-contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZkbwIrL//qqnlqWZ60=
 contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/AlecAivazis/survey/v2 v2.0.5 h1:xpZp+Q55wi5C7Iaze+40onHnEkex1jSc34CltJjOoPM=
 github.com/AlecAivazis/survey/v2 v2.0.5/go.mod h1:WYBhg6f0y/fNYUuesWQc0PKbJcEliGcYHB9sNT3Bg74=
-github.com/Azure/azure-amqp-common-go/v3 v3.1.0 h1:1N4YSkWYWffOpQHromYdOucBSQXhNRKzqtgICy6To8Q=
 github.com/Azure/azure-amqp-common-go/v3 v3.1.0/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0=
 github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U=
 github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k=
 github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 github.com/Azure/azure-sdk-for-go v54.0.0+incompatible h1:Bq3L9LF0DHCexlT0fccwxgrOMfjHx8LGz+d+L7gGQv4=
 github.com/Azure/azure-sdk-for-go v54.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-service-bus-go v0.10.11 h1:GBg2mcLQA3af+w+ZuYhiAv58OWSVmQYWcds4nro8Xko=
 github.com/Azure/azure-service-bus-go v0.10.11/go.mod h1:AWw9eTTWZVZyvgpPahD1ybz3a8/vT3GsJDS8KYex55U=
 github.com/Azure/azure-storage-blob-go v0.13.0 h1:lgWHvFh+UYBNVQLFHXkvul2f6yOPA9PIH82RTG2cSwc=
 github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nUdBD+e64lEuc4sVnuOfNs=
 github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs=
 github.com/Azure/go-amqp v0.13.4/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI=
-github.com/Azure/go-amqp v0.13.7 h1:ukcCtx138ZmOfHbdALuh9yoJhGtOY3+yaKApfzNvhSk=
 github.com/Azure/go-amqp v0.13.7/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI=
 github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
 github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
@@ -99,7 +86,6 @@ github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpz
 github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
 github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
 github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
 github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk=
 github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
@@ -110,13 +96,9 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z
 github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
 github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4=
 github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
-github.com/GoogleCloudPlatform/cloudsql-proxy v1.22.0 h1:aTDBS16pX1X4ZR/GFsC2NcOCYJ1hDJwJm3WmKRA905Q=
 github.com/GoogleCloudPlatform/cloudsql-proxy v1.22.0/go.mod h1:mAm5O/zik2RFmcpigNjg6nMotDL8ZXJaxKzgGVcSMFA=
 github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg=
 github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
@@ -128,32 +110,22 @@ github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jB
 github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
 github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
 github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
-github.com/Microsoft/hcsshim v0.8.9 h1:VrfodqvztU8YSOvygU+DN1BGaSGxmrNfqOv5oOuX2Bk=
 github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8=
-github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw=
 github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
-github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ=
 github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
-github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
 github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
-github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
 github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
 github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
 github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
 github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
-github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
 github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
 github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
 github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/andybalholm/crlf v0.0.0-20171020200849-670099aa064f h1:NNJE6p4LchkmNfNskDUaSbrwxZzr7t2/lj2aS+q4oF0=
 github.com/andybalholm/crlf v0.0.0-20171020200849-670099aa064f/go.mod h1:k8feO4+kXDxro6ErPXBRTJ/ro2mf0SsFG8s7doP9kJE=
 github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
 github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
@@ -164,14 +136,11 @@ github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFU
 github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
 github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
 github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
-github.com/apparentlymart/go-textseg/v12 v12.0.0 h1:bNEQyAGak9tojivJNkoqWErVCQbjdL7GzRt3F8NvfJ0=
 github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
 github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
 github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
-github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs=
-github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro=
 github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
@@ -189,7 +158,6 @@ github.com/aws/aws-sdk-go v1.38.35 h1:7AlAO0FC+8nFjxiGKEmq0QLpiA8/XFr6eIxgRTwkdT
 github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
 github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
@@ -197,94 +165,60 @@ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQ
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
 github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
-github.com/bsm/go-vlq v0.0.0-20150828105119-ec6e8d4f5f4e h1:D64GF/Xr5zSUnM3q1Jylzo4sK7szhP/ON+nb2DB5XJA=
 github.com/bsm/go-vlq v0.0.0-20150828105119-ec6e8d4f5f4e/go.mod h1:N+BjUcTjSxc2mtRGSCPsat1kze3CUtvJN3/jTXlp29k=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk=
 github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cheggaaa/pb v1.0.18/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
 github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc=
 github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
-github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY=
 github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
-github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA=
 github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
-github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w=
 github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s=
 github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
-github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1 h1:uict5mhHFTzKLUCufdSLym7z/J0CbBJT59lYbP9wtbg=
 github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
 github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
-github.com/containerd/containerd v1.3.4 h1:3o0smo5SKY7H6AJCmJhsnCjR2/V2T8VmiHt7seN2/kI=
 github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
-github.com/containerd/continuity v0.0.0-20200709052629-daa8e1ccc0bc h1:lDK/G7OlwUnJW3O6nv/8M89bMupV6FuLK6FXmC3ueWc=
 github.com/containerd/continuity v0.0.0-20200709052629-daa8e1ccc0bc/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo=
-github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448 h1:PUD50EuOMkXVcpBIA/R95d56duJR9VxhwncsFbNnxW4=
 github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
-github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3 h1:esQOJREg8nw8aXj6uCN5dfW5cKUBiEJ/+nni1Q/D/sw=
 github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
-github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de h1:dlfGmNcE3jDAecLqwKPMNX6nk2qh1c1Vg1/YTzpOOF4=
 github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
-github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd h1:JNn81o/xG+8NEo3bC/vx9pbi/g2WI8mtP2/nXzu297Y=
 github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
-github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04=
 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY=
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.3.1 h1:7OO2CXWMYNDdaAzP51t4lCCZWwpQHmvPbm9sxWjm3So=
 github.com/coreos/go-systemd/v22 v22.3.1/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk=
 github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
-github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA=
 github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
 github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
 github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
 github.com/djherbis/times v1.2.0 h1:xANXjsC/iBqbO00vkWlYwPWgBgEVU6m6AFYg0Pic+Mc=
 github.com/djherbis/times v1.2.0/go.mod h1:CGMZlo255K5r4Yw0b9RRfFQpM2y7uOmxg4jm9HsaVf8=
-github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
 github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 github.com/docker/docker v1.4.2-0.20200319182547-c7ad2b866182 h1:Caj/qGJ9KyulC1WSksyPgp7r8+DKgTGfU39lmb2C5MQ=
 github.com/docker/docker v1.4.2-0.20200319182547-c7ad2b866182/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
-github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
@@ -296,91 +230,58 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d h1:QyzYnTnPE15SQyUeqU6qLbWxMkwyAyu+vGksa0b7j00=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
-github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
 github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
-github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
-github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE=
 github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ=
 github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9yhSRvsmYyZsshflcR6ePWYLql6UU1amW13IM=
-github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
 github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
-github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
 github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
 github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
 github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-asn1-ber/asn1-ber v1.3.1 h1:gvPdv/Hr++TRFCl0UbPFHC54P9N9jgsRPnmnr419Uck=
 github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
-github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
 github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
 github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34=
 github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8=
 github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0=
-github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4=
 github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo=
 github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8=
-github.com/go-ldap/ldap/v3 v3.1.10 h1:7WsKqasmPThNvdl0Q5GPpbTDD/ZD98CfuawrMIuh7qQ=
 github.com/go-ldap/ldap/v3 v3.1.10/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
 github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
-github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
 github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
-github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
 github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
-github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
-github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
 github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
 github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
 github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
 github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
-github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
 github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
-github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
 github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
-github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
 github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
-github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8=
 github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
-github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc=
 github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
@@ -390,7 +291,6 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
 github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -407,7 +307,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
 github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
 github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g=
 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
 github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -432,7 +331,6 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW
 github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -449,11 +347,8 @@ github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
 github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
-github.com/google/go-replayers/grpcreplay v1.0.0 h1:B5kVOzJ1hBgnevTgIWhSTatQ3608yu/2NnU0Ta1d0kY=
 github.com/google/go-replayers/grpcreplay v1.0.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE=
-github.com/google/go-replayers/httpreplay v0.1.2 h1:HCfx+dQzwN9XbGTHF8qJ+67WN8glL9FTWV5rraCJ/jU=
 github.com/google/go-replayers/httpreplay v0.1.2/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no=
-github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE=
@@ -472,11 +367,8 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
 github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5 h1:zIaiqGYDQwa4HVx5wGRTXbx38Pqxjemn4BP98wpzpXo=
 github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k=
 github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -490,13 +382,9 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
 github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
 github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c=
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI=
 github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU=
 github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw=
@@ -504,7 +392,6 @@ github.com/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357/go.mod h1:YH+1FK
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
 github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU=
 github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
 github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
@@ -522,9 +409,7 @@ github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39
 github.com/hashicorp/go-hclog v0.15.0 h1:qMuK0wxsoW4D0ddCCYwPSTm4KQv1X1ke3WmPWZ0Mvsk=
 github.com/hashicorp/go-hclog v0.15.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc=
 github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-kms-wrapping/entropy v0.1.0 h1:xuTi5ZwjimfpvpL09jDE71smCBRpnF5xfo871BSX4gs=
 github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g=
 github.com/hashicorp/go-multierror v0.0.0-20180717150148-3d5d8f294aa0/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
 github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
@@ -557,7 +442,6 @@ github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04
 github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
 github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
 github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
@@ -565,7 +449,6 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
 github.com/hashicorp/hcl/v2 v2.0.0/go.mod h1:oVVDG71tEinNGYCxinCYadcmKU9bglqW9pV3txagJ90=
 github.com/hashicorp/hcl/v2 v2.3.0 h1:iRly8YaMwTBAKhn1Ybk7VSdzbnopghktCD031P8ggUE=
 github.com/hashicorp/hcl/v2 v2.3.0/go.mod h1:d+FwDBbOLvpAM3Z6J7gPj/VoAGkNe/gm352ZhjJ/Zv8=
-github.com/hashicorp/hcl2 v0.0.0-20190821123243-0c888d1241f6 h1:JImQpEeUQ+0DPFMaWzLA0GdUNPaUlCXLpfiqkSZBUfc=
 github.com/hashicorp/hcl2 v0.0.0-20190821123243-0c888d1241f6/go.mod h1:Cxv+IJLuBiEhQ7pBYGEuORa0nr4U994pE8mYLuFd7v0=
 github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590/go.mod h1:n2TSygSNwsLJ76m8qFXTSc7beTb+auJxYdqrnoqwZWE=
 github.com/hashicorp/hil v0.0.0-20190212132231-97b3a9cdfa93 h1:T1Q6ag9tCwun16AW+XK3tAql24P4uTGUMIn1/92WsQQ=
@@ -575,13 +458,12 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
 github.com/hashicorp/terraform-config-inspect v0.0.0-20190821133035-82a99dc22ef4/go.mod h1:JDmizlhaP5P0rYTTZB0reDMefAiJyfWPEtugV4in1oI=
 github.com/hashicorp/terraform-config-inspect v0.0.0-20191115094559-17f92b0546e8 h1:+RyjwU+Gnd/aTJBPZVDNm903eXVjjqhbaR4Ypx3xYyY=
 github.com/hashicorp/terraform-config-inspect v0.0.0-20191115094559-17f92b0546e8/go.mod h1:p+ivJws3dpqbp1iP84+npOyAmTTOLMgCzrXd3GSdn/A=
-github.com/hashicorp/terraform-exec v0.14.0 h1:UQoUcxKTZZXhyyK68Cwn4mApT4mnFPmEXPiqaHL9r+w=
 github.com/hashicorp/terraform-exec v0.14.0/go.mod h1:qrAASDq28KZiMPDnQ02sFS9udcqEkRly002EA2izXTA=
 github.com/hashicorp/terraform-json v0.4.0/go.mod h1:eAbqb4w0pSlRmdvl8fOyHAi/+8jnkVYN28gJkSJrLhU=
 github.com/hashicorp/terraform-json v0.12.0 h1:8czPgEEWWPROStjkWPUnTQDXmpmZPlkQAwYYLETaTvw=
 github.com/hashicorp/terraform-json v0.12.0/go.mod h1:pmbq9o4EuL43db5+0ogX10Yofv1nozM+wskr/bGFJpI=
-github.com/hashicorp/terraform-plugin-go v0.3.0 h1:AJqYzP52JFYl9NABRI7smXI1pNjgR5Q/y2WyVJ/BOZA=
-github.com/hashicorp/terraform-plugin-go v0.3.0/go.mod h1:dFHsQMaTLpON2gWhVWT96fvtlc/MF1vSy3OdMhWBzdM=
+github.com/hashicorp/terraform-plugin-go v0.4.0 h1:LFbXNeLDo0J/wR0kUzSPq0RpdmFh2gNedzU0n/gzPAo=
+github.com/hashicorp/terraform-plugin-go v0.4.0/go.mod h1:7u/6nt6vaiwcWE2GuJKbJwNlDFnf5n95xKw4hqIVr58=
 github.com/hashicorp/terraform-plugin-sdk v1.0.0/go.mod h1:NuwtLpEpPsFaKJPJNGtMcn9vlhe6Ofe+Y6NqXhJgV2M=
 github.com/hashicorp/terraform-plugin-sdk v1.7.0 h1:B//oq0ZORG+EkVrIJy0uPGSonvmXqxSzXe8+GhknoW0=
 github.com/hashicorp/terraform-plugin-sdk v1.7.0/go.mod h1:OjgQmey5VxnPej/buEhe+YqKm0KNvV3QqU4hkqHqPCY=
@@ -600,14 +482,11 @@ github.com/hashicorp/vault/sdk v0.2.0/go.mod h1:cAGI4nVnEfAyMeqt9oB+Mase8DNn3qA/
 github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
 github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ=
 github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
-github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ=
 github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
-github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
 github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ijc/Gotty v0.0.0-20170406111628-a8b993ba6abd h1:anPrsicrIi2ColgWTVPk+TrN42hJIWlfPHSBP9S0ZkM=
 github.com/ijc/Gotty v0.0.0-20170406111628-a8b993ba6abd/go.mod h1:3LVOLeyx9XVvwPgrt2be44XgSqndprz1G18rSk8KD84=
@@ -619,7 +498,6 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
-github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
 github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
 github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE=
 github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
@@ -630,9 +508,7 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
-github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
 github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
-github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
@@ -640,19 +516,15 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
 github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba h1:NARVGAAgEXvoMeNPHhPFt1SBt1VMznA3Gnz9d0qj+co=
 github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/errcheck v1.2.0 h1:reN85Pxc5larApoH1keMBiu2GWtPqXQ1nc9gx+jOU+E=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
-github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
@@ -660,7 +532,6 @@ github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+O
 github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -668,7 +539,6 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI=
 github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -676,14 +546,10 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
 github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
 github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
 github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo=
 github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
 github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
@@ -704,7 +570,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
 github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0=
 github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
 github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
@@ -746,51 +611,35 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
 github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223 h1:F9x/1yl3T2AeKLr2AMdilSD8+f9bvMnNN8VS5iDtovc=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/mxschmitt/golang-combinations v1.0.0 h1:NFoO7CSP8MUcFlHpe1YdewKwMa15dgDbaqkVLC5DUPI=
 github.com/mxschmitt/golang-combinations v1.0.0/go.mod h1:RbMhWvfCelHR6WROvT2bVfxJvZHoEvBj71SKe+H0MYU=
-github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E=
 github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce h1:RPclfga2SEJmgMmz2k+Mg7cowZ8yv4Trqw9UsJby758=
 github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce/go.mod h1:uFMI8w+ref4v2r9jz+c9i1IfIttS/OkmLfrk1jne5hs=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
 github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
-github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
-github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
-github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
 github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
 github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
-github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y=
 github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
-github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI=
 github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo=
 github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
 github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
 github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
 github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
-github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386 h1:LoCV5cscNVWyK5ChN/uCoIFJz8jZD63VQiGJIRgr6uo=
 github.com/pgavlin/goldmark v1.1.33-0.20200616210433-b5eb04559386/go.mod h1:MRxHTJrf9FhdfNQ8Hdeh9gmHevC9RJE/fu8M3JIGjoE=
@@ -812,115 +661,80 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP
 github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.4.0 h1:YVIb/fVcOTMSqtqZWSKnHpSLBxu8DKgxq8z6RuBZwqI=
 github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
 github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8=
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/pulumi/pulumi/pkg/v3 v3.9.0 h1:s6pXlO0DblIdA2msQ5VENdsbStD1SyQluCvdsBgvG2E=
-github.com/pulumi/pulumi/pkg/v3 v3.9.0/go.mod h1:2Y+Q5wUVGmJ2T3jyBxXEe1C0MjNwWn0dwG4blLB3om8=
-github.com/pulumi/pulumi/pkg/v3 v3.9.1 h1:kgIQijlHW/3W/9ONBgk7Zb392I5OPUj6XpHyhChrwaM=
-github.com/pulumi/pulumi/pkg/v3 v3.9.1/go.mod h1:2Y+Q5wUVGmJ2T3jyBxXEe1C0MjNwWn0dwG4blLB3om8=
-github.com/pulumi/pulumi/pkg/v3 v3.10.3 h1:wirHxzWi3Hlis89zXzs36mXtrWhGf2mC7fY+8kwGo9A=
-github.com/pulumi/pulumi/pkg/v3 v3.10.3/go.mod h1:2Y+Q5wUVGmJ2T3jyBxXEe1C0MjNwWn0dwG4blLB3om8=
-github.com/pulumi/pulumi/pkg/v3 v3.11.0 h1:ssi11ft8/iV93uGwobruBSxb4Ikxga0Xg12XzhOuDJc=
-github.com/pulumi/pulumi/pkg/v3 v3.11.0/go.mod h1:2Y+Q5wUVGmJ2T3jyBxXEe1C0MjNwWn0dwG4blLB3om8=
-github.com/pulumi/pulumi/pkg/v3 v3.12.0 h1:pkfMQpCK2kQhRzqijiLtM/Y/wJOqSO2JQQJZhKGZoQE=
-github.com/pulumi/pulumi/pkg/v3 v3.12.0/go.mod h1:OKKvB7W0q739IaDSlai/bpNBTc7+5/sTUwysYjZ1we8=
-github.com/pulumi/pulumi/sdk/v3 v3.3.1/go.mod h1:GBHyQ7awNQSRmiKp/p8kIKrGrMOZeA/k2czoM/GOqds=
-github.com/pulumi/pulumi/sdk/v3 v3.9.0 h1:CGBEoPwKVv9GCb8wfgej096n9aZ26H1jUZzMw98NNGs=
-github.com/pulumi/pulumi/sdk/v3 v3.9.0/go.mod h1:GBHyQ7awNQSRmiKp/p8kIKrGrMOZeA/k2czoM/GOqds=
-github.com/pulumi/pulumi/sdk/v3 v3.9.1 h1:lThSiXzA9M+RjA6mquz+Oy569GSGyERPu/pGXLxA/xM=
-github.com/pulumi/pulumi/sdk/v3 v3.9.1/go.mod h1:GBHyQ7awNQSRmiKp/p8kIKrGrMOZeA/k2czoM/GOqds=
-github.com/pulumi/pulumi/sdk/v3 v3.10.3 h1:7XCZRTU5GHg8Us4s7nHJmQhRurLXVmPQ+4MdbHekudE=
-github.com/pulumi/pulumi/sdk/v3 v3.10.3/go.mod h1:GBHyQ7awNQSRmiKp/p8kIKrGrMOZeA/k2czoM/GOqds=
-github.com/pulumi/pulumi/sdk/v3 v3.11.0 h1:XljryA45etplc9WfmTm8/DKi5Evx94j0qQ7ovSWL/To=
-github.com/pulumi/pulumi/sdk/v3 v3.11.0/go.mod h1:bxxmONw/K6M4KHRKWTwP/u77JbqDFnt96p0nSsrsHnQ=
-github.com/pulumi/pulumi/sdk/v3 v3.12.0 h1:kxvjRHE0G33jJiAHroh5kt7PFUwmFhbLcsUKEw6EcmI=
-github.com/pulumi/pulumi/sdk/v3 v3.12.0/go.mod h1:bxxmONw/K6M4KHRKWTwP/u77JbqDFnt96p0nSsrsHnQ=
+github.com/pulumi/pulumi/pkg/v3 v3.17.0 h1:YzBQ7kkQ1XRFhL0XZA0R5aI7onyNz4W87EqErzNe0po=
+github.com/pulumi/pulumi/pkg/v3 v3.17.0/go.mod h1:tWkGLs8Xxo0I4CU5FK+FOuwvEeREbcRk46dtT6sE+rE=
+github.com/pulumi/pulumi/sdk/v3 v3.17.0 h1:CxdgdmFEvo99JviXP6d332Y2AyAIPbLI6fu4K33vhAg=
+github.com/pulumi/pulumi/sdk/v3 v3.17.0/go.mod h1:252ou/zAU1g6E8iTwe2Y9ht7pb5BDl2fJlOuAgZCHiA=
 github.com/pulumi/terraform-diff-reader v0.0.0-20201211191010-ad4715e9285e h1:Dik4Qe/+xguB8JagPyXNlbOnRiXGmq/PSPQTGunYnTk=
 github.com/pulumi/terraform-diff-reader v0.0.0-20201211191010-ad4715e9285e/go.mod h1:sZ9FUzGO+yM41hsQHs/yIcj/Y993qMdBxBU5mpDmAfQ=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20210629210550-59d24255d71f h1:YWtQ7xeRQvB9h5Uwtrl9wDKRKkyLTXWBzU7x0c9VOZ4=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20210629210550-59d24255d71f/go.mod h1:grseeRo9g3yNkYW09iFlV8LG78jTa1ssBgouogQg/RU=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20211019193655-b23eb83463bb h1:JEeybF3EqQUk5PdSd0+NN3sWgYxsL8w6KD5LLEyQENg=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20211019193655-b23eb83463bb/go.mod h1:6KbP09YzlB++S6XSUKYl83WyoHVN4MgeoCbPRsdfCtA=
 github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8=
 github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af h1:gu+uRPtBe88sKxUCEXRoeCvVG90TJmwhiqRpvdhQFng=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s=
 github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
 github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
 github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0=
 github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ=
-github.com/sebdah/goldie v1.0.0 h1:9GNhIat69MSlz/ndaBg48vl9dF5fI+NBB6kfOxgfkMc=
+github.com/santhosh-tekuri/jsonschema/v5 v5.0.0 h1:TToq11gyfNlrMFZiYujSekIsPd9AmsA2Bj/iv+s4JHE=
+github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0=
 github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4=
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
 github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/shirou/gopsutil v3.21.7+incompatible h1:g/wcPHcuCQvHSePVofjQljd2vX4ty0+J6VoMB+NPcdk=
 github.com/shirou/gopsutil v3.21.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
-github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
 github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU=
 github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
 github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA=
 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
-github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
 github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
-github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
 github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
 github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
@@ -936,13 +750,9 @@ github.com/terraform-providers/terraform-provider-http v1.2.0 h1:pOP/SNlLjB18Cyd
 github.com/terraform-providers/terraform-provider-http v1.2.0/go.mod h1:2Iot921OkLVSZr8FbIkvRN84ZV3w+oFKb7RlmPTQQAQ=
 github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6 h1:9VTskZOIRf2vKF3UL8TuWElry5pgUpV1tFSe/e/0m/E=
 github.com/texttheater/golang-levenshtein v0.0.0-20191208221605-eb6844b05fc6/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
-github.com/tklauser/go-sysconf v0.3.8 h1:41Nq9J+pxKud4IQ830J5LlS5nl67dVQC7AuisUooaOU=
 github.com/tklauser/go-sysconf v0.3.8/go.mod h1:z4zYWRS+X53WUKtBcmDg1comV3fPhdQnzasnIHUoLDU=
-github.com/tklauser/numcpus v0.2.3 h1:nQ0QYpiritP6ViFhrKYsiv6VVxOpum2Gks5GhnJbS/8=
 github.com/tklauser/numcpus v0.2.3/go.mod h1:vpEPS/JC+oZGGQ/My/vJnNsvMDQL6PwOqt8dsCw5j+E=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8=
 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
 github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7 h1:X9dsIWPuuEJlPX//UmRKophhOKCGXc46RVIGuttks68=
 github.com/tweekmonster/luser v0.0.0-20161003172636-3fa38070dbd7/go.mod h1:UxoP3EypF8JfGEjAII8jx1q8rQyDnX8qdTCs/UQBVIE=
@@ -951,14 +761,11 @@ github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMW
 github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw=
 github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
-github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
 github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
-github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
 github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
 github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
 github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 h1:MCfT24H3f//U5+UCrZp1/riVO3B50BovxtDiNn0XKkk=
 github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
 github.com/vmihailenco/msgpack v4.0.1+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
@@ -977,14 +784,11 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
 github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow=
 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
 github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
@@ -993,11 +797,9 @@ github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q
 github.com/zclconf/go-cty v1.3.1/go.mod h1:YO23e2L18AG+ZYQfSobnY4G65nvwvprPCxBHkufUH1k=
 github.com/zclconf/go-cty v1.8.4 h1:pwhhz5P+Fjxse7S7UriBrMu6AUJSZM5pKqGem1PjGAs=
 github.com/zclconf/go-cty v1.8.4/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
-github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI=
 github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
 github.com/zclconf/go-cty-yaml v1.0.1 h1:up11wlgAaDvlAGENcFDnZgkn0qUJurso7k6EpURKNF8=
 github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
-go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@@ -1014,12 +816,9 @@ go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
-go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
-go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
 go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
 gocloud.dev v0.23.0 h1:u/6F8slWwaZPgGpjpNp0jzH+1P/M2ri7qEP3lFgbqBE=
 gocloud.dev v0.23.0/go.mod h1:zklCCIIo1N9ELkU2S2E7tW8P8eeMU7oGLeQCXdDwx9Q=
@@ -1058,10 +857,8 @@ golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u0
 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -1076,7 +873,6 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI
 golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
 golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
@@ -1234,7 +1030,6 @@ golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 h1:cdsMqa2nXzqlgs183pHxtvoVwU7CyzaCTAUOg94af4c=
 golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1450,9 +1245,7 @@ google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/l
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 gopkg.in/AlecAivazis/survey.v1 v1.8.9-0.20200217094205-6773bdf39b7f h1:AQkMzsSzHWrgZWqGRpuRaRPDmyNibcXlpGcnQJ7HxZw=
 gopkg.in/AlecAivazis/survey.v1 v1.8.9-0.20200217094205-6773bdf39b7f/go.mod h1:CaHjv79TCgAvXMSFJSVgonHXYWxnhzI3eoHtnX5UgUo=
-gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1463,13 +1256,9 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
 gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk=
 gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0=
 gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
-gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
 gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
@@ -1480,7 +1269,6 @@ gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOA
 gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g=
 gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE=
 gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
 gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
@@ -1494,9 +1282,7 @@ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
-gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E=
 gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1504,20 +1290,15 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M=
 howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0=
 nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
-nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
 nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
-rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
+pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g=
+pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM=
 sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
-sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 h1:e1sMhtVq9AfcEy8AXNb8eSg6gbzfdpYhoNqnPJa+GzI=
 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k=
diff --git a/pkg/tf2pulumi/convert/convert.go b/pkg/tf2pulumi/convert/convert.go
index 6a4f8671..ae64a69d 100644
--- a/pkg/tf2pulumi/convert/convert.go
+++ b/pkg/tf2pulumi/convert/convert.go
@@ -21,17 +21,18 @@ import (
 	"os"
 
 	"github.com/hashicorp/hcl/v2"
+	"github.com/spf13/afero"
+
+	"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tf2pulumi/il"
 	hcl2dotnet "github.com/pulumi/pulumi/pkg/v3/codegen/dotnet"
 	hcl2go "github.com/pulumi/pulumi/pkg/v3/codegen/go"
-	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2"
 	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2/syntax"
 	hcl2nodejs "github.com/pulumi/pulumi/pkg/v3/codegen/nodejs"
+	"github.com/pulumi/pulumi/pkg/v3/codegen/pcl"
 	hcl2python "github.com/pulumi/pulumi/pkg/v3/codegen/python"
+	"github.com/pulumi/pulumi/pkg/v3/codegen/schema"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
-	"github.com/spf13/afero"
-
-	"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tf2pulumi/il"
 )
 
 const (
@@ -164,9 +165,11 @@ type Options struct {
 	// Root, when set, overrides the default filesystem used to load the source Terraform module.
 	Root afero.Fs
 	// Optional package cache.
-	PackageCache *hcl2.PackageCache
+	PackageCache *pcl.PackageCache
 	// Optional plugin host.
 	PluginHost plugin.Host
+	// Optional Loader.
+	Loader schema.Loader
 	// Optional source for provider schema information.
 	ProviderInfoSource il.ProviderInfoSource
 	// Optional logger for diagnostic information.
diff --git a/pkg/tf2pulumi/convert/model_helpers.go b/pkg/tf2pulumi/convert/model_helpers.go
new file mode 100644
index 00000000..c2b4b65c
--- /dev/null
+++ b/pkg/tf2pulumi/convert/model_helpers.go
@@ -0,0 +1,139 @@
+// Copyright 2016-2021, Pulumi Corporation.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This module provides helper functions to work with
+// `github.com/pulumi/pulumi/pkg/v3/codegen/hcl2/model` that have not
+// yet made it upstream.
+
+package convert
+
+import (
+	"fmt"
+	"github.com/hashicorp/hcl/v2"
+	//"strings"
+
+	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2/model"
+)
+
+// Helps assign a type to a `Type="config"` block. It is currently not
+// apparent from the types, but blocks carry 1 or 2 labels, with the
+// second optional label encoding the type of the variable.
+//
+// Example block in HCL syntax:
+//
+//     config foo "int" {
+//        default = 1
+//     }
+//
+// The type is decoded downstream (as in
+// `github.com/pulumi/pulumi/pkg/codegen/pcl/binder.go`) in PCL
+// processing. Currently we cannot guarantee that all posible
+// `model.Type` values survive the string encoding and subsequent
+// decoding. Thereore this function mimicks downstream decoding to see
+// if the value turns around, and aborts processing if that is not the
+// case.
+func setConfigBlockType(block *model.Block, variableType model.Type) error {
+	if block.Type != "config" {
+		return fmt.Errorf("setConfigBlockType should only be used on block.Type='config' blocks")
+	}
+
+	if len(block.Labels) >= 2 {
+		return fmt.Errorf("setConfigBlockType refuses to overwrite block.Label[1]")
+	}
+
+	tempScope := model.TypeScope.Push(nil)
+	typeString := fmt.Sprintf("%v", variableType)
+	typeExpr, diags := model.BindExpressionText(
+		typeString,
+		tempScope,
+		hcl.Pos{})
+
+	if typeExpr == nil || diags.HasErrors() {
+		return fmt.Errorf(
+			"Type %s prints as '%s' but cannot be parsed back. Diagnostics: %v",
+			variableType.String(),
+			typeString,
+			diags)
+	}
+
+	if variableType.String() != typeExpr.Type().String() {
+		return fmt.Errorf(
+			"Type T1=%s prints as '%s' which parses as T2=%s, expected T1=T2",
+			variableType.String(),
+			typeString,
+			typeExpr.Type(),
+		)
+	}
+
+	block.Labels = append(block.Labels, typeString)
+	return nil
+}
+
+// Substitutes `model.ConstType` with the underlying type.
+func generalizeConstType(t model.Type) model.Type {
+	return typeTransform(t, func(t model.Type) model.Type {
+		switch sT := t.(type) {
+		case *model.ConstType:
+			return sT.Type
+		default:
+			return t
+		}
+	})
+}
+
+// Views `model.Type` as a recursive tree and transforms a given tree
+// `t` by wrapping the `transform` around every node.
+func typeTransform(t model.Type, transform func(model.Type) model.Type) model.Type {
+	rec := func(t model.Type) model.Type {
+		return typeTransform(t, transform)
+	}
+	recSlice := func(ts []model.Type) []model.Type {
+		var result []model.Type
+		for _, t := range ts {
+			result = append(result, rec(t))
+		}
+		return result
+	}
+	recMap := func(ts map[string]model.Type) map[string]model.Type {
+		result := map[string]model.Type{}
+		for k, t := range ts {
+			result[k] = rec(t)
+		}
+		return result
+	}
+	var t2 model.Type
+	switch sT := t.(type) {
+	case *model.ConstType:
+		t2 = model.NewConstType(rec(sT.Type), sT.Value)
+	case *model.ListType:
+		t2 = model.NewListType(rec(sT.ElementType))
+	case *model.MapType:
+		t2 = model.NewMapType(rec(sT.ElementType))
+	case *model.ObjectType:
+		t2 = model.NewObjectType(recMap(sT.Properties), sT.Annotations...)
+	case *model.OutputType:
+		t2 = model.NewOutputType(rec(sT.ElementType))
+	case *model.PromiseType:
+		t2 = model.NewPromiseType(rec(sT.ElementType))
+	case *model.SetType:
+		t2 = model.NewSetType(rec(sT.ElementType))
+	case *model.TupleType:
+		t2 = model.NewTupleType(recSlice(sT.ElementTypes)...)
+	case *model.UnionType:
+		t2 = model.NewUnionType(recSlice(sT.ElementTypes)...)
+	default:
+		t2 = t
+	}
+	return transform(t2)
+}
diff --git a/pkg/tf2pulumi/convert/tf12.go b/pkg/tf2pulumi/convert/tf12.go
index a40cd0b2..844b6e87 100644
--- a/pkg/tf2pulumi/convert/tf12.go
+++ b/pkg/tf2pulumi/convert/tf12.go
@@ -10,9 +10,9 @@ import (
 	"github.com/hashicorp/hcl/v2"
 	"github.com/hashicorp/hcl/v2/hclsyntax"
 	"github.com/pulumi/pulumi/pkg/v3/codegen"
-	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2"
 	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2/model"
 	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2/syntax"
+	"github.com/pulumi/pulumi/pkg/v3/codegen/pcl"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
 	"github.com/spf13/afero"
 	"github.com/zclconf/go-cty/cty"
@@ -74,24 +74,27 @@ func parseTF12(opts Options) ([]*syntax.File, hcl.Diagnostics) {
 	return parser.Files, parser.Diagnostics
 }
 
-func convertTF12(files []*syntax.File, opts Options) ([]*syntax.File, *hcl2.Program, hcl.Diagnostics, error) {
+func convertTF12(files []*syntax.File, opts Options) ([]*syntax.File, *pcl.Program, hcl.Diagnostics, error) {
 	var hcl2Options []model.BindOption
-	var pulumiOptions []hcl2.BindOption
+	var pulumiOptions []pcl.BindOption
 	if opts.AllowMissingProperties {
-		pulumiOptions = append(pulumiOptions, hcl2.AllowMissingProperties)
+		pulumiOptions = append(pulumiOptions, pcl.AllowMissingProperties)
 	}
 	if opts.AllowMissingVariables {
 		hcl2Options = append(hcl2Options, model.AllowMissingVariables)
-		pulumiOptions = append(pulumiOptions, hcl2.AllowMissingVariables)
+		pulumiOptions = append(pulumiOptions, pcl.AllowMissingVariables)
 	}
 	if opts.PluginHost != nil {
-		pulumiOptions = append(pulumiOptions, hcl2.PluginHost(opts.PluginHost))
+		pulumiOptions = append(pulumiOptions, pcl.PluginHost(opts.PluginHost))
 	}
 	if opts.PackageCache != nil {
-		pulumiOptions = append(pulumiOptions, hcl2.Cache(opts.PackageCache))
+		pulumiOptions = append(pulumiOptions, pcl.Cache(opts.PackageCache))
 	}
 	if opts.SkipResourceTypechecking {
-		pulumiOptions = append(pulumiOptions, hcl2.SkipResourceTypechecking)
+		pulumiOptions = append(pulumiOptions, pcl.SkipResourceTypechecking)
+	}
+	if opts.Loader != nil {
+		pulumiOptions = append(pulumiOptions, pcl.Loader(opts.Loader))
 	}
 
 	// Bind the files into a module.
@@ -163,14 +166,14 @@ func convertTF12(files []*syntax.File, opts Options) ([]*syntax.File, *hcl2.Prog
 		}
 	}
 
-	program, programDiags, err := hcl2.BindProgram(pulumiParser.Files, pulumiOptions...)
+	program, programDiags, err := pcl.BindProgram(pulumiParser.Files, pulumiOptions...)
 	diagnostics = append(diagnostics, programDiags...)
 
 	return pulumiParser.Files, program, diagnostics, err
 }
 
 type tf12binder struct {
-	pulumiOptions       []hcl2.BindOption
+	pulumiOptions       []pcl.BindOption
 	hcl2Options         []model.BindOption
 	filterResourceNames bool
 	providerInfo        il.ProviderInfoSource
@@ -711,7 +714,7 @@ func (b *tf12binder) bindVariable(v *variable) hcl.Diagnostics {
 	if typeDecl, hasType := block.Body.Attribute("type"); hasType {
 		variableType = typeDecl.Value.Type()
 	} else if defaultDecl, hasDefault := block.Body.Attribute("default"); hasDefault {
-		variableType = defaultDecl.Value.Type()
+		variableType = generalizeConstType(defaultDecl.Value.Type())
 	}
 
 	v.terraformType, v.block = variableType, block
@@ -897,7 +900,22 @@ func (b *tf12binder) genVariable(w io.Writer, v *variable) hcl.Diagnostics {
 	v.block.Type = "config"
 	v.block.Labels[0] = v.pulumiName
 	if v.terraformType != model.DynamicType {
-		v.block.Labels = append(v.block.Labels, fmt.Sprintf("%v", v.terraformType))
+		err := setConfigBlockType(v.block, v.terraformType)
+		if err != nil {
+			msg := fmt.Sprintf(`Ignoring inferred type for %s.
+
+The default value implies that the variable has type '%s', but this type fails
+to encode correctly. Error:
+
+%v`,
+				v.pulumiName,
+				v.terraformType.String(),
+				err)
+			diagnostics = append(diagnostics, &hcl.Diagnostic{
+				Severity: hcl.DiagWarning,
+				Summary:  msg,
+			})
+		}
 	}
 
 	_, err := fmt.Fprintf(w, "%v", v.block)
@@ -1837,6 +1855,13 @@ var tf12builtins = map[string]*model.Function{
 		}},
 		ReturnType: model.StringType,
 	}),
+	"filebase64sha256": model.NewFunction(model.StaticFunctionSignature{
+		Parameters: []model.Parameter{{
+			Name: "path",
+			Type: model.StringType,
+		}},
+		ReturnType: model.StringType,
+	}),
 	"jsonencode": model.NewFunction(model.StaticFunctionSignature{
 		Parameters: []model.Parameter{{
 			Name: "value",
diff --git a/pkg/tf2pulumi/convert/tf12_names.go b/pkg/tf2pulumi/convert/tf12_names.go
index 9664c218..cf38f8bb 100644
--- a/pkg/tf2pulumi/convert/tf12_names.go
+++ b/pkg/tf2pulumi/convert/tf12_names.go
@@ -22,7 +22,7 @@ import (
 	"unicode/utf8"
 
 	"github.com/hashicorp/hcl/v2"
-	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2"
+	"github.com/pulumi/pulumi/pkg/v3/codegen/pcl"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
 
 	"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfbridge"
@@ -162,7 +162,7 @@ func (nt *nameTable) disambiguateResourceName(n *resource) string {
 
 	// Determine the resource's Pulumi package, module, and type name. These will be used during the disambiguation
 	// process. If these names cannot be determined, return an ugly name comprised of the TF type and name.
-	packageName, moduleName, typeName, diags := hcl2.DecomposeToken(n.token, hcl.Range{})
+	packageName, moduleName, typeName, diags := pcl.DecomposeToken(n.token, hcl.Range{})
 	if len(diags) != 0 {
 		return cleanName(n.typeName + "_" + n.name)
 	}
diff --git a/pkg/tf2pulumi/internal/config/config_string.go b/pkg/tf2pulumi/internal/config/config_string.go
index a6933c2a..74be1bb2 100644
--- a/pkg/tf2pulumi/internal/config/config_string.go
+++ b/pkg/tf2pulumi/internal/config/config_string.go
@@ -57,7 +57,7 @@ func terraformStr(t *Terraform) string {
 		result += fmt.Sprintf("backend (%s)\n", b.Type)
 
 		keys := make([]string, 0, len(b.RawConfig.Raw))
-		for k, _ := range b.RawConfig.Raw {
+		for k := range b.RawConfig.Raw {
 			keys = append(keys, k)
 		}
 		sort.Strings(keys)
@@ -90,7 +90,7 @@ func modulesStr(ms []*Module) string {
 		result += fmt.Sprintf("%s\n", m.Id())
 
 		ks := make([]string, 0, len(m.RawConfig.Raw))
-		for k, _ := range m.RawConfig.Raw {
+		for k := range m.RawConfig.Raw {
 			ks = append(ks, k)
 		}
 		sort.Strings(ks)
@@ -207,7 +207,7 @@ func providerConfigsStr(pcs []*ProviderConfig) string {
 		result += fmt.Sprintf("%s\n", n)
 
 		keys := make([]string, 0, len(pc.RawConfig.Raw))
-		for k, _ := range pc.RawConfig.Raw {
+		for k := range pc.RawConfig.Raw {
 			keys = append(keys, k)
 		}
 		sort.Strings(keys)
@@ -262,7 +262,7 @@ func resourcesStr(rs []*Resource) string {
 			r.RawCount.Value())
 
 		ks := make([]string, 0, len(r.RawConfig.Raw))
-		for k, _ := range r.RawConfig.Raw {
+		for k := range r.RawConfig.Raw {
 			ks = append(ks, k)
 		}
 		sort.Strings(ks)
@@ -286,7 +286,7 @@ func resourcesStr(rs []*Resource) string {
 				}
 
 				ks := make([]string, 0, len(p.RawConfig.Raw))
-				for k, _ := range p.RawConfig.Raw {
+				for k := range p.RawConfig.Raw {
 					ks = append(ks, k)
 				}
 				sort.Strings(ks)
@@ -308,7 +308,7 @@ func resourcesStr(rs []*Resource) string {
 			result += fmt.Sprintf("  vars\n")
 
 			ks := make([]string, 0, len(r.RawConfig.Variables))
-			for k, _ := range r.RawConfig.Variables {
+			for k := range r.RawConfig.Variables {
 				ks = append(ks, k)
 			}
 			sort.Strings(ks)
diff --git a/pkg/tf2pulumi/internal/config/interpolate_funcs.go b/pkg/tf2pulumi/internal/config/interpolate_funcs.go
index 6a2050c9..6de39e65 100644
--- a/pkg/tf2pulumi/internal/config/interpolate_funcs.go
+++ b/pkg/tf2pulumi/internal/config/interpolate_funcs.go
@@ -1229,7 +1229,7 @@ func interpolationFuncKeys(vs map[string]ast.Variable) ast.Function {
 			mapVar := args[0].(map[string]ast.Variable)
 			keys := make([]string, 0)
 
-			for k, _ := range mapVar {
+			for k := range mapVar {
 				keys = append(keys, k)
 			}
 
@@ -1251,7 +1251,7 @@ func interpolationFuncValues(vs map[string]ast.Variable) ast.Function {
 			mapVar := args[0].(map[string]ast.Variable)
 			keys := make([]string, 0)
 
-			for k, _ := range mapVar {
+			for k := range mapVar {
 				keys = append(keys, k)
 			}
 
diff --git a/pkg/tf2pulumi/internal/config/loader_hcl.go b/pkg/tf2pulumi/internal/config/loader_hcl.go
index 38c7535e..9ee08cc8 100644
--- a/pkg/tf2pulumi/internal/config/loader_hcl.go
+++ b/pkg/tf2pulumi/internal/config/loader_hcl.go
@@ -43,15 +43,15 @@ var ReservedProviderFields = []string{
 
 func (t *hclConfigurable) Config() (*Config, error) {
 	validKeys := map[string]struct{}{
-		"atlas":     struct{}{},
-		"data":      struct{}{},
-		"locals":    struct{}{},
-		"module":    struct{}{},
-		"output":    struct{}{},
-		"provider":  struct{}{},
-		"resource":  struct{}{},
-		"terraform": struct{}{},
-		"variable":  struct{}{},
+		"atlas":     {},
+		"data":      {},
+		"locals":    {},
+		"module":    {},
+		"output":    {},
+		"provider":  {},
+		"resource":  {},
+		"terraform": {},
+		"variable":  {},
 	}
 
 	// Top-level item should be the object list
@@ -1260,7 +1260,7 @@ func unwrapHCLObjectKeysFromJSON(item *ast.ObjectItem, depth int) {
 			item.Val = &ast.ObjectType{
 				List: &ast.ObjectList{
 					Items: []*ast.ObjectItem{
-						&ast.ObjectItem{
+						{
 							Keys: []*ast.ObjectKey{key},
 							Val:  item.Val,
 						},
diff --git a/pkg/tf2pulumi/internal/config/module/inode.go b/pkg/tf2pulumi/internal/config/module/inode.go
index da520abc..5f42115b 100644
--- a/pkg/tf2pulumi/internal/config/module/inode.go
+++ b/pkg/tf2pulumi/internal/config/module/inode.go
@@ -1,3 +1,4 @@
+//go:build linux || darwin || openbsd || netbsd || solaris || dragonfly
 // +build linux darwin openbsd netbsd solaris dragonfly
 
 package module
diff --git a/pkg/tf2pulumi/internal/config/module/inode_freebsd.go b/pkg/tf2pulumi/internal/config/module/inode_freebsd.go
index 0d95730d..39a4b061 100644
--- a/pkg/tf2pulumi/internal/config/module/inode_freebsd.go
+++ b/pkg/tf2pulumi/internal/config/module/inode_freebsd.go
@@ -1,3 +1,4 @@
+//go:build freebsd
 // +build freebsd
 
 package module
diff --git a/pkg/tf2pulumi/internal/config/module/inode_windows.go b/pkg/tf2pulumi/internal/config/module/inode_windows.go
index c0cf4553..189a98ea 100644
--- a/pkg/tf2pulumi/internal/config/module/inode_windows.go
+++ b/pkg/tf2pulumi/internal/config/module/inode_windows.go
@@ -1,3 +1,4 @@
+//go:build windows
 // +build windows
 
 package module
diff --git a/pkg/tf2pulumi/internal/config/raw_config.go b/pkg/tf2pulumi/internal/config/raw_config.go
index 23e58b56..93a84f4e 100644
--- a/pkg/tf2pulumi/internal/config/raw_config.go
+++ b/pkg/tf2pulumi/internal/config/raw_config.go
@@ -177,7 +177,7 @@ func (r *RawConfig) Merge(other *RawConfig) *RawConfig {
 		}
 
 		result.unknownKeys = make([]string, 0, len(unknownKeys))
-		for k, _ := range unknownKeys {
+		for k := range unknownKeys {
 			result.unknownKeys = append(result.unknownKeys, k)
 		}
 	}
diff --git a/pkg/tfbridge/info.go b/pkg/tfbridge/info.go
index adacd821..84e0c440 100644
--- a/pkg/tfbridge/info.go
+++ b/pkg/tfbridge/info.go
@@ -44,9 +44,11 @@ type ProviderInfo struct {
 	GitHubOrg               string                             // the GitHub org of the provider. Defaults to `terraform-providers`.
 	GitHubHost              string                             // the GitHub host for the provider. Defaults to `github.com`.
 	Description             string                             // an optional descriptive overview of the package (a default supplied).
-	Keywords                []string                           // an optional list of keywords to help discovery of this package.
+	Keywords                []string                           // an optional list of keywords to help discovery of this package. e.g. "category/cloud, category/infrastructure"
 	License                 string                             // the license, if any, the resulting package has (default is none).
 	LogoURL                 string                             // an optional URL to the logo of the package
+	DisplayName             string                             // the human friendly name of the package used in the Pulumi registry
+	Publisher               string                             // the name of the person or organization that authored and published the package.
 	Homepage                string                             // the URL to the project homepage.
 	Repository              string                             // the URL to the project source code repository.
 	Version                 string                             // the version of the provider package.
diff --git a/pkg/tfbridge/schema.go b/pkg/tfbridge/schema.go
index 1c58b9e1..7b553c1c 100644
--- a/pkg/tfbridge/schema.go
+++ b/pkg/tfbridge/schema.go
@@ -955,12 +955,12 @@ func CoerceTerraformString(schType shim.ValueType, ps *SchemaInfo, stringValue s
 	// breaking overrides where we have a string and a TransformJSONDocument (see pulumi/pulumi#4592)
 	if ps != nil && ps.Type != "" {
 		switch strings.ToLower(ps.Type.String()) {
-		case "boolean":
+		case "bool", "boolean":
 			if stringValue == "" {
 				return nil, nil
 			}
 			return convertTfStringToBool(stringValue)
-		case "int":
+		case "int", "integer":
 			return convertTfStringToInt(stringValue)
 		case "float":
 			return convertTfStringToFloat(stringValue)
diff --git a/pkg/tfgen/docs.go b/pkg/tfgen/docs.go
index 07d83982..70d0f233 100644
--- a/pkg/tfgen/docs.go
+++ b/pkg/tfgen/docs.go
@@ -30,6 +30,7 @@ import (
 	"sync"
 
 	"github.com/hashicorp/go-multierror"
+	hclV2 "github.com/hashicorp/hcl/v2"
 	"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tf2pulumi/gen/python"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
 	"github.com/spf13/afero"
@@ -1082,7 +1083,7 @@ func (g *Generator) convertExamples(docs, name string, stripSubsectionsWithError
 // convertHCL converts an in-memory, simple HCL program to Pulumi, and returns it as a string. In the event
 // of failure, the error returned will be non-nil, and the second string contains the stderr stream of details.
 func (g *Generator) convertHCL(hcl, path string) (string, string, error) {
-	g.debug(fmt.Sprintf("converting HCL for %s", path))
+	g.debug("converting HCL for %s", path)
 
 	// Fixup the HCL as necessary.
 	if fixed, ok := fixHcl(hcl); ok {
@@ -1114,6 +1115,7 @@ func (g *Generator) convertHCL(hcl, path string) (string, string, error) {
 		}
 
 		files, diags, err := convert.Convert(convert.Options{
+			Loader:                   newLoader(g.pluginHost),
 			Root:                     input,
 			TargetLanguage:           languageName,
 			AllowMissingProperties:   true,
@@ -1126,8 +1128,17 @@ func (g *Generator) convertHCL(hcl, path string) (string, string, error) {
 			SkipResourceTypechecking: true,
 			TerraformVersion:         g.terraformVersion,
 		})
+
 		if err != nil {
+			diags, isDiags := err.(hclV2.Diagnostics)
+			if isDiags {
+				for i, d := range diags {
+					g.debug("Diagnostic %d: %v", i, d)
+				}
+			}
+
 			g.coverageTracker.languageConversionPanic(languageName, err.Error())
+			g.error("failed to convert HCL for %s to %v: %v", path, languageName, err)
 			return fmt.Errorf("failed to convert HCL for %s to %v: %w", path, languageName, err)
 		}
 		if diags.All.HasErrors() {
diff --git a/pkg/tfgen/examples_coverage_exporter.go b/pkg/tfgen/examples_coverage_exporter.go
index 33912e1c..2842abc2 100644
--- a/pkg/tfgen/examples_coverage_exporter.go
+++ b/pkg/tfgen/examples_coverage_exporter.go
@@ -66,13 +66,10 @@ func (ce *coverageExportUtil) exportByExample(outputDirectory string, fileName s
 
 	// The Coverage Tracker data structure is flattened down to the example level, and they all
 	// get individually written to the file in order to not have the "{ }" brackets at the start and end
-	type SingleExampleResult struct {
-		ProviderName    string
-		ProviderVersion string
-		ExampleName     string
-		OriginalHCL     string `json:"OriginalHCL,omitempty"`
-		IsDuplicated    bool
-		FailedLanguages []LanguageConversionResult `json:"FailedLanguages,omitempty"`
+	type FlattenedExample struct {
+		ExampleName       string
+		OriginalHCL       string `json:"OriginalHCL,omitempty"`
+		ConversionResults map[string]*LanguageConversionResult
 	}
 
 	jsonOutputLocation, err := createEmptyFile(outputDirectory, fileName)
@@ -80,33 +77,28 @@ func (ce *coverageExportUtil) exportByExample(outputDirectory string, fileName s
 		return err
 	}
 
-	// All the examples in the map are iterated by key and marshalled into one large byte array
-	// separated by \n, making the end result look like a bunch of Json files that got concatenated
+	// All the examples in the tracker are iterated by page ID + index, and marshalled into one large byte
+	// array separated by \n, making the end result look like a bunch of Json files that got concatenated
 	var result []byte
-	for _, exampleInMap := range ce.Tracker.EncounteredExamples {
-		singleExample := SingleExampleResult{
-			ProviderName:    ce.Tracker.ProviderName,
-			ProviderVersion: ce.Tracker.ProviderVersion,
-			ExampleName:     exampleInMap.Name,
-			OriginalHCL:     "",
-			FailedLanguages: []LanguageConversionResult{},
-		}
+	for _, page := range ce.Tracker.EncounteredPages {
+		for index, example := range page.Examples {
+			flattenedName := page.Name
+			if len(page.Examples) > 1 {
+				flattenedName += fmt.Sprintf("#%d", index)
+			}
 
-		// The current example's language conversion results are iterated over. If the severity is
-		// anything but zero, then it means some sort of error occurred during conversion and
-		// should be logged for future analysis.
-		for _, conversionResult := range exampleInMap.LanguagesConvertedTo {
-			if conversionResult.FailureSeverity != 0 {
-				singleExample.OriginalHCL = exampleInMap.OriginalHCL
-				singleExample.FailedLanguages = append(singleExample.FailedLanguages, *conversionResult)
+			flattenedExample := FlattenedExample{
+				ExampleName:       flattenedName,
+				OriginalHCL:       example.OriginalHCL,
+				ConversionResults: example.ConversionResults,
 			}
-			singleExample.IsDuplicated = singleExample.IsDuplicated || conversionResult.MultipleTranslations
-		}
-		marshalledExample, err := json.MarshalIndent(singleExample, "", "\t")
-		if err != nil {
-			return err
+
+			marshalledExample, err := json.MarshalIndent(flattenedExample, "", "\t")
+			if err != nil {
+				return err
+			}
+			result = append(append(result, marshalledExample...), uint8('\n'))
 		}
-		result = append(append(result, marshalledExample...), uint8('\n'))
 	}
 	return ioutil.WriteFile(jsonOutputLocation, result, 0600)
 }
@@ -141,41 +133,44 @@ func (ce *coverageExportUtil) exportByLanguage(outputDirectory string, fileName
 
 	// All the conversion attempts for each example are iterated by language name and
 	// their results are added to the main map
-	for _, exampleInMap := range ce.Tracker.EncounteredExamples {
-		for _, conversionResult := range exampleInMap.LanguagesConvertedTo {
-			var language *LanguageStatistic
-			if val, ok := allLanguageStatistics[conversionResult.TargetLanguage]; ok {
-
-				// The main map already contains the language entry
-				language = val
-			} else {
-
-				// The main map doesn't yet contain this language, and it needs to be added
-				allLanguageStatistics[conversionResult.TargetLanguage] = &LanguageStatistic{0,
-					NumPct{0, 0.0}, NumPct{0, 0.0},
-					NumPct{0, 0.0}, NumPct{0, 0.0},
-					make(map[string]int), []ErrorMessage{}}
-				language = allLanguageStatistics[conversionResult.TargetLanguage]
-			}
+	for _, page := range ce.Tracker.EncounteredPages {
+		for _, example := range page.Examples {
+			for languageName, conversionResult := range example.ConversionResults {
+
+				// Obtaining the current language we will be creating statistics for
+				var currentLanguage *LanguageStatistic
+				if existingLanguage, ok := allLanguageStatistics[languageName]; ok {
+
+					// Current language already exists in main map
+					currentLanguage = existingLanguage
+				} else {
+
+					// The main map doesn't yet contain this language, and it needs to be added
+					allLanguageStatistics[languageName] = &LanguageStatistic{0,
+						NumPct{0, 0.0}, NumPct{0, 0.0},
+						NumPct{0, 0.0}, NumPct{0, 0.0},
+						make(map[string]int), []ErrorMessage{}}
+					currentLanguage = allLanguageStatistics[languageName]
+				}
 
-			// The language's entry in the summarized results is updated and any
-			// error messages are saved
-			language.Total++
-			if conversionResult.FailureSeverity == Success {
-				language.Successes.Number++
-			} else {
-
-				// A failure occurred during conversion so we take the failure info
-				// and add it to the histogram
-				language._errorHistogram[conversionResult.FailureInfo]++
-
-				switch conversionResult.FailureSeverity {
-				case Warning:
-					language.Warnings.Number++
-				case Failure:
-					language.Failures.Number++
-				default:
-					language.Fatals.Number++
+				// The language's entry in the main map is updated and any error messages are saved
+				currentLanguage.Total++
+				if conversionResult.FailureSeverity == Success {
+					currentLanguage.Successes.Number++
+				} else {
+
+					// A failure occurred during conversion so we take the failure info
+					// and add it to the histogram
+					currentLanguage._errorHistogram[conversionResult.FailureInfo]++
+
+					switch conversionResult.FailureSeverity {
+					case Warning:
+						currentLanguage.Warnings.Number++
+					case Failure:
+						currentLanguage.Failures.Number++
+					default:
+						currentLanguage.Fatals.Number++
+					}
 				}
 			}
 		}
@@ -244,25 +239,27 @@ func (ce *coverageExportUtil) exportOverall(outputDirectory string, fileName str
 
 	// All the conversion attempts for each example are iterated by language name and
 	// their results are added to the overall statistic
-	for _, exampleInMap := range ce.Tracker.EncounteredExamples {
-		providerStatistic.Examples++
-		for _, conversionResult := range exampleInMap.LanguagesConvertedTo {
-			providerStatistic.TotalConversions++
-			if conversionResult.FailureSeverity == Success {
-				providerStatistic.Successes.Number++
-			} else {
-
-				// A failure occurred during conversion so we take the failure info
-				// and add it to the histogram
-				providerStatistic._errorHistogram[conversionResult.FailureInfo]++
-
-				switch conversionResult.FailureSeverity {
-				case Warning:
-					providerStatistic.Warnings.Number++
-				case Failure:
-					providerStatistic.Failures.Number++
-				default:
-					providerStatistic.Fatals.Number++
+	for _, page := range ce.Tracker.EncounteredPages {
+		for _, example := range page.Examples {
+			providerStatistic.Examples++
+			for _, conversionResult := range example.ConversionResults {
+				providerStatistic.TotalConversions++
+				if conversionResult.FailureSeverity == Success {
+					providerStatistic.Successes.Number++
+				} else {
+
+					// A failure occurred during conversion so we take the failure info
+					// and add it to the histogram
+					providerStatistic._errorHistogram[conversionResult.FailureInfo]++
+
+					switch conversionResult.FailureSeverity {
+					case Warning:
+						providerStatistic.Warnings.Number++
+					case Failure:
+						providerStatistic.Failures.Number++
+					default:
+						providerStatistic.Fatals.Number++
+					}
 				}
 			}
 		}
@@ -320,27 +317,31 @@ func (ce *coverageExportUtil) exportHumanReadable(outputDirectory string, fileNa
 
 	// All the conversion attempts for each example are iterated by language name and
 	// their results are added to the main map
-	for _, exampleInMap := range ce.Tracker.EncounteredExamples {
-		providerStatistic.Examples++
-		for _, conversionResult := range exampleInMap.LanguagesConvertedTo {
-			providerStatistic.TotalConversions++
-			var language *LanguageStatistic
-			if val, ok := allLanguageStatistics[conversionResult.TargetLanguage]; ok {
-
-				// The main map already contains the language entry
-				language = val
-			} else {
-
-				// The main map doesn't yet contain this language, and it needs to be added
-				allLanguageStatistics[conversionResult.TargetLanguage] = &LanguageStatistic{0, 0}
-				language = allLanguageStatistics[conversionResult.TargetLanguage]
-			}
+	for _, page := range ce.Tracker.EncounteredPages {
+		for _, example := range page.Examples {
+			providerStatistic.Examples++
+			for languageName, conversionResult := range example.ConversionResults {
+				providerStatistic.TotalConversions++
+
+				// Obtaining the current language we will be creating statistics for
+				var currentLanguage *LanguageStatistic
+				if val, ok := allLanguageStatistics[languageName]; ok {
+
+					// Current language already exists in main map
+					currentLanguage = val
+				} else {
+
+					// The main map doesn't yet contain this language, and it needs to be added
+					allLanguageStatistics[languageName] = &LanguageStatistic{0, 0}
+					currentLanguage = allLanguageStatistics[languageName]
+				}
 
-			// The language's entry in the summarized results is updated and any
-			language.Total++
-			if conversionResult.FailureSeverity == Success {
-				providerStatistic.Successes++
-				language.Successes++
+				// The language's entry in the summarized results is updated and any
+				currentLanguage.Total++
+				if conversionResult.FailureSeverity == Success {
+					providerStatistic.Successes++
+					currentLanguage.Successes++
+				}
 			}
 		}
 	}
diff --git a/pkg/tfgen/examples_coverage_tracker.go b/pkg/tfgen/examples_coverage_tracker.go
index 867cb35f..ae5b26c6 100644
--- a/pkg/tfgen/examples_coverage_tracker.go
+++ b/pkg/tfgen/examples_coverage_tracker.go
@@ -34,38 +34,55 @@ import (
 	"github.com/hashicorp/hcl/v2"
 )
 
-// Main overarching structure for storing coverage data on how many examples were processed,
-// how many failed, and for what reason. At different stages, the code translator notifies
-// the tracker of what is going on. Notifications are treated as an ordered stream of events.
-// INTERFACE:
-// foundExample(), languageConversionSuccess(), languageConversionFailure(), languageConversionPanic().
+/*
+Main overarching structure for storing coverage data on how many examples were processed,
+how many failed, and for what reason. At different stages, the code translator notifies
+the tracker of what is going on. Notifications are treated as an ordered sequence of events.
+
+NOTIFICATION INTERFACE:
+
+foundExample(pageName, hcl)
+
+languageConversionSuccess(targetLanguage)
+
+languageConversionWarning(targetLanguage, warningDiagnostics)
+
+languageConversionFailure(targetLanguage, failureDiagnostics)
+
+languageConversionPanic(targetLanguage, panicInfo)
+*/
 type CoverageTracker struct {
-	ProviderName        string                         // Name of the provider
-	ProviderVersion     string                         // Version of the provider
-	currentExampleName  string                         // Name of current example that is being processed
-	EncounteredExamples map[string]*GeneralExampleInfo // Mapping example names to their general information
+	ProviderName     string                        // Name of the provider
+	ProviderVersion  string                        // Version of the provider
+	currentPageName  string                        // Name of current page that is being processed
+	EncounteredPages map[string]*DocumentationPage // Map linking page IDs to their data
 }
 
-// General information about an example, and how successful it was at being converted to different languages
-type GeneralExampleInfo struct {
-	Name                   string
-	OriginalHCL            string
-	LanguagesConvertedTo   map[string]*LanguageConversionResult // Mapping language names to their conversion diagnostics
-	NameFoundMultipleTimes bool                                 // Current name has already been encountered before
+// A structure encompassing a single page, which contains one or more examples.
+// This closely resembles the web pages seen in Pulumi/Terraform documentation.
+type DocumentationPage struct {
+	Name     string    // The unique ID of this documentation page
+	Examples []Example // This page's examples, stored in the order they were found
+}
+
+// Contains information about a single example, consisting of a block of HCL and
+// one or more language conversion results.
+type Example struct {
+	OriginalHCL       string                               // Original HCL code that the example was found with
+	ConversionResults map[string]*LanguageConversionResult // Mapping language names to their conversion results
 }
 
 // Individual language information concerning how successfully an example was converted to Pulumi
 type LanguageConversionResult struct {
-	TargetLanguage  string
-	FailureSeverity int    // [Success, Warning, Failure, Fatal]
+	FailureSeverity int    // This conversion's outcome: [Success, Warning, Failure, Fatal]
 	FailureInfo     string // Additional in-depth information
 
-	// !! Current example name has already been converted for this specific language before.
-	// Either the example is duplicated, or a bug is present !!
-	MultipleTranslations bool
+	// How many times this example has been converted to this language.
+	// It is expected that this will be equal to 1.
+	TranslationCount int
 }
 
-// Failure severity values
+// Conversion outcome severity values
 const (
 	Success = 0
 	Warning = 1
@@ -75,96 +92,99 @@ const (
 
 func newCoverageTracker(ProviderName string, ProviderVersion string) *CoverageTracker {
 	return &CoverageTracker{ProviderName, ProviderVersion, "",
-		make(map[string]*GeneralExampleInfo)}
+		make(map[string]*DocumentationPage)}
 }
 
-// Used when: generator has found a new example with a convertible block of HCL
-func (ct *CoverageTracker) foundExample(exampleName string, hcl string) {
+// Used when: generator has found a brand new example, with a convertible block
+// of HCL that hasn't been encountered before.
+func (ct *CoverageTracker) foundExample(pageName string, hcl string) {
 	if ct == nil {
 		return
 	}
-	ct.currentExampleName = exampleName
-	if val, ok := ct.EncounteredExamples[exampleName]; ok {
-		val.NameFoundMultipleTimes = true
+	ct.currentPageName = pageName
+
+	if existingPage, ok := ct.EncounteredPages[pageName]; ok {
+		// This example's page already exists. Appending example to it.
+		existingPage.Examples = append(existingPage.Examples, Example{hcl, make(map[string]*LanguageConversionResult)})
 	} else {
-		ct.EncounteredExamples[exampleName] = &GeneralExampleInfo{exampleName, hcl,
-			make(map[string]*LanguageConversionResult), false}
+		// Initializing a page for this example.
+		ct.EncounteredPages[pageName] = &DocumentationPage{
+			pageName,
+			[]Example{Example{hcl, make(map[string]*LanguageConversionResult)}},
+		}
 	}
 }
 
 // Used when: current example has been successfully converted to a certain language
-func (ct *CoverageTracker) languageConversionSuccess(targetLanguage string) {
+func (ct *CoverageTracker) languageConversionSuccess(languageName string) {
 	if ct == nil {
 		return
 	}
-	ct.insertLanguageConversionResult(LanguageConversionResult{
-		TargetLanguage:       targetLanguage,
-		FailureSeverity:      0,
-		FailureInfo:          "",
-		MultipleTranslations: false,
+	ct.insertLanguageConversionResult(languageName, LanguageConversionResult{
+		FailureSeverity:  Success,
+		FailureInfo:      "",
+		TranslationCount: 1,
 	})
 }
 
 //nolint
 // Used when: generator has successfully converted current example, but threw out some warnings
-func (ct *CoverageTracker) languageConversionWarning(targetLanguage string, warningDiagnostics hcl.Diagnostics) {
+func (ct *CoverageTracker) languageConversionWarning(languageName string, warningDiagnostics hcl.Diagnostics) {
 	if ct == nil {
 		return
 	}
-	ct.insertLanguageConversionResult(LanguageConversionResult{
-		TargetLanguage:       targetLanguage,
-		FailureSeverity:      1,
-		FailureInfo:          formatDiagnostics(warningDiagnostics),
-		MultipleTranslations: false,
+	ct.insertLanguageConversionResult(languageName, LanguageConversionResult{
+		FailureSeverity:  Warning,
+		FailureInfo:      formatDiagnostics(warningDiagnostics),
+		TranslationCount: 1,
 	})
 }
 
 // Used when: generator has failed to convert the current example to a certain language
-func (ct *CoverageTracker) languageConversionFailure(targetLanguage string, failureDiagnostics hcl.Diagnostics) {
+func (ct *CoverageTracker) languageConversionFailure(languageName string, failureDiagnostics hcl.Diagnostics) {
 	if ct == nil {
 		return
 	}
-	ct.insertLanguageConversionResult(LanguageConversionResult{
-		TargetLanguage:       targetLanguage,
-		FailureSeverity:      2,
-		FailureInfo:          formatDiagnostics(failureDiagnostics),
-		MultipleTranslations: false,
+	ct.insertLanguageConversionResult(languageName, LanguageConversionResult{
+		FailureSeverity:  Failure,
+		FailureInfo:      formatDiagnostics(failureDiagnostics),
+		TranslationCount: 1,
 	})
 }
 
 // Used when: generator encountered a fatal internal error when trying to convert the
 // current example to a certain language
-func (ct *CoverageTracker) languageConversionPanic(targetLanguage string, panicInfo string) {
+func (ct *CoverageTracker) languageConversionPanic(languageName string, panicInfo string) {
 	if ct == nil {
 		return
 	}
-	ct.insertLanguageConversionResult(LanguageConversionResult{
-		TargetLanguage:       targetLanguage,
-		FailureSeverity:      3,
-		FailureInfo:          panicInfo,
-		MultipleTranslations: false,
+	ct.insertLanguageConversionResult(languageName, LanguageConversionResult{
+		FailureSeverity:  Fatal,
+		FailureInfo:      panicInfo,
+		TranslationCount: 1,
 	})
 }
 
 // Adding a language conversion result to the current example. If a conversion result with the same
 // target language already exists, keep the lowest severity one and mark the example as possibly duplicated
-func (ct *CoverageTracker) insertLanguageConversionResult(conversionResult LanguageConversionResult) {
-	if currentExample, ok := ct.EncounteredExamples[ct.currentExampleName]; ok {
-		if existingConversionResult, ok := currentExample.LanguagesConvertedTo[conversionResult.TargetLanguage]; ok {
-
-			// If incoming result is of a lower severity, keep it instead of the existing one
-			if conversionResult.FailureSeverity < existingConversionResult.FailureSeverity {
-				currentExample.LanguagesConvertedTo[conversionResult.TargetLanguage] = &conversionResult
+func (ct *CoverageTracker) insertLanguageConversionResult(languageName string, newConversionResult LanguageConversionResult) {
+	if currentPage, ok := ct.EncounteredPages[ct.currentPageName]; ok {
+		lastExample := currentPage.lastExample()
+
+		if existingConversionResult, ok := lastExample.ConversionResults[languageName]; ok {
+			// Example already has this language conversion attempt. Replace if new one has a lower severity
+			if newConversionResult.FailureSeverity < existingConversionResult.FailureSeverity {
+				lastExample.ConversionResults[languageName] = &newConversionResult
 			}
-			existingConversionResult.MultipleTranslations = true
+			existingConversionResult.TranslationCount += 1
 		} else {
-
-			// A brand new language conversion result is being added for this example
-			currentExample.LanguagesConvertedTo[conversionResult.TargetLanguage] = &conversionResult
+			// The new language conversion result is added for this example
+			lastExample.ConversionResults[languageName] = &newConversionResult
 		}
 	} else {
-		fmt.Println("Error: attempted to log the result of a language conversion without first finding an example")
-		fmt.Println(conversionResult)
+		// Check that foundExample() is called before all other Coverage Tracker interface methods
+		fmt.Println("Error: attempted to log an example language conversion result without first finding its page")
+		fmt.Println(newConversionResult)
 		panic("")
 	}
 }
@@ -202,6 +222,11 @@ func formatDiagnostics(diagnostics hcl.Diagnostics) string {
 	return strings.Join(results[:], "; ")
 }
 
+// Returning the page's last example, to which conversion results will be added.
+func (Page *DocumentationPage) lastExample() *Example {
+	return &Page.Examples[len(Page.Examples)-1]
+}
+
 // Exporting the coverage results
 func (ct *CoverageTracker) exportResults(outputDirectory string) error {
 	coverageExportUtil := newCoverageExportUtil(ct)
diff --git a/pkg/tfgen/generate.go b/pkg/tfgen/generate.go
index f4182f99..a10a43b4 100644
--- a/pkg/tfgen/generate.go
+++ b/pkg/tfgen/generate.go
@@ -30,8 +30,8 @@ import (
 	"github.com/pulumi/pulumi/pkg/v3/codegen"
 	dotnetgen "github.com/pulumi/pulumi/pkg/v3/codegen/dotnet"
 	gogen "github.com/pulumi/pulumi/pkg/v3/codegen/go"
-	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2"
 	nodejsgen "github.com/pulumi/pulumi/pkg/v3/codegen/nodejs"
+	"github.com/pulumi/pulumi/pkg/v3/codegen/pcl"
 	pygen "github.com/pulumi/pulumi/pkg/v3/codegen/python"
 	pschema "github.com/pulumi/pulumi/pkg/v3/codegen/schema"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/diag"
@@ -61,7 +61,7 @@ type Generator struct {
 	root             afero.Fs              // the output virtual filesystem.
 	providerShim     *inmemoryProvider     // a provider shim to hold the provider schema during example conversion.
 	pluginHost       plugin.Host           // the plugin host for tf2pulumi.
-	packageCache     *hcl2.PackageCache    // the package cache for tf2pulumi.
+	packageCache     *pcl.PackageCache     // the package cache for tf2pulumi.
 	infoSource       il.ProviderInfoSource // the provider info source for tf2pulumi.
 	terraformVersion string                // the Terraform version to target for example codegen, if any
 	sink             diag.Sink
@@ -688,7 +688,7 @@ func NewGenerator(opts GeneratorOptions) (*Generator, error) {
 			Host:  host,
 			cache: map[string]plugin.Provider{},
 		},
-		packageCache:     hcl2.NewPackageCache(),
+		packageCache:     pcl.NewPackageCache(),
 		infoSource:       host,
 		terraformVersion: opts.TerraformVersion,
 		sink:             sink,
diff --git a/pkg/tfgen/generate_schema.go b/pkg/tfgen/generate_schema.go
index 7e614eb5..942ccafd 100644
--- a/pkg/tfgen/generate_schema.go
+++ b/pkg/tfgen/generate_schema.go
@@ -200,6 +200,8 @@ func (g *schemaGenerator) genPackageSpec(pack *pkg) (pschema.PackageSpec, error)
 		Homepage:          g.info.Homepage,
 		License:           g.info.License,
 		Repository:        g.info.Repository,
+		Publisher:         g.info.Publisher,
+		DisplayName:       g.info.DisplayName,
 		PluginDownloadURL: g.info.PluginDownloadURL,
 		Resources:         map[string]pschema.ResourceSpec{},
 		Functions:         map[string]pschema.FunctionSpec{},
diff --git a/pkg/tfgen/loaders.go b/pkg/tfgen/loaders.go
new file mode 100644
index 00000000..49e1e559
--- /dev/null
+++ b/pkg/tfgen/loaders.go
@@ -0,0 +1,49 @@
+// Copyright 2016-2021, Pulumi Corporation.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package tfgen
+
+import (
+	"github.com/blang/semver"
+
+	"github.com/pulumi/pulumi/pkg/v3/codegen/schema"
+	"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
+)
+
+type loader struct {
+	innerLoader   schema.Loader
+	emptyPackages map[string]bool
+}
+
+var _ schema.Loader = &loader{}
+
+func (l *loader) LoadPackage(name string, ver *semver.Version) (*schema.Package, error) {
+	if l.emptyPackages[name] {
+		return &schema.Package{}, nil
+	}
+	return l.innerLoader.LoadPackage(name, ver)
+}
+
+// Overrides `schema.NewPluginLoader` to load an empty
+// `*schema.Package{}` when `name=''` is requested. In the doc
+// generation context a dummy package seems better than failing in the
+// case.
+func newLoader(host plugin.Host) *loader {
+	return &loader{
+		innerLoader: schema.NewPluginLoader(host),
+		emptyPackages: map[string]bool{
+			"": true,
+		},
+	}
+}
diff --git a/pkg/tfshim/tfplugin5/instance_diff.go b/pkg/tfshim/tfplugin5/instance_diff.go
index f4f7a59b..34cf0cbd 100644
--- a/pkg/tfshim/tfplugin5/instance_diff.go
+++ b/pkg/tfshim/tfplugin5/instance_diff.go
@@ -20,6 +20,7 @@ const timeoutsKey = "e2bfb730-ecaa-11e6-8f88-34363bc7c4c0"
 var _ = shim.InstanceDiff((*instanceDiff)(nil))
 
 type instanceDiff struct {
+	config      cty.Value
 	planned     cty.Value
 	meta        map[string]interface{}
 	destroy     bool
@@ -27,11 +28,12 @@ type instanceDiff struct {
 	attributes  map[string]shim.ResourceAttrDiff
 }
 
-func newInstanceDiff(prior, planned cty.Value, meta map[string]interface{},
+func newInstanceDiff(config, prior, planned cty.Value, meta map[string]interface{},
 	requiresReplace []*proto.AttributePath) *instanceDiff {
 
 	attributes, requiresNew := computeDiff(prior, planned, requiresReplace)
 	return &instanceDiff{
+		config:      config,
 		planned:     planned,
 		meta:        meta,
 		destroy:     planned.IsNull(),
diff --git a/pkg/tfshim/tfplugin5/provider.go b/pkg/tfshim/tfplugin5/provider.go
index 0372635f..5bb3d1d8 100644
--- a/pkg/tfshim/tfplugin5/provider.go
+++ b/pkg/tfshim/tfplugin5/provider.go
@@ -326,6 +326,7 @@ func (p *provider) Diff(t string, s shim.InstanceState, c shim.ResourceConfig) (
 		TypeName:         resource.resourceType,
 		PriorState:       &proto.DynamicValue{Msgpack: stateBytes},
 		ProposedNewState: &proto.DynamicValue{Msgpack: configBytes},
+		Config:           &proto.DynamicValue{Msgpack: configBytes},
 		PriorPrivate:     metaBytes,
 	})
 	if err != nil {
@@ -342,7 +343,7 @@ func (p *provider) Diff(t string, s shim.InstanceState, c shim.ResourceConfig) (
 		return nil, err
 	}
 
-	return newInstanceDiff(stateVal, plannedVal, plannedMeta, resp.RequiresReplace), nil
+	return newInstanceDiff(configVal, stateVal, plannedVal, plannedMeta, resp.RequiresReplace), nil
 }
 
 func (p *provider) Apply(t string, s shim.InstanceState, d shim.InstanceDiff) (shim.InstanceState, error) {
@@ -381,10 +382,19 @@ func (p *provider) Apply(t string, s shim.InstanceState, d shim.InstanceDiff) (s
 		return nil, err
 	}
 
+	if diff.config == (cty.Value{}) {
+		diff.config = cty.NullVal(resource.ctyType)
+	}
+	configBytes, err := msgpack.Marshal(diff.config, resource.ctyType)
+	if err != nil {
+		return nil, err
+	}
+
 	resp, err := p.client.ApplyResourceChange(context.TODO(), &proto.ApplyResourceChange_Request{
 		TypeName:       resource.resourceType,
 		PriorState:     &proto.DynamicValue{Msgpack: stateBytes},
 		PlannedState:   &proto.DynamicValue{Msgpack: plannedStateBytes},
+		Config:         &proto.DynamicValue{Msgpack: configBytes},
 		PlannedPrivate: plannedMetaBytes,
 	})
 	if err != nil {


Test patch:
diff --git a/pkg/tf2pulumi/convert/model_helpers_test.go b/pkg/tf2pulumi/convert/model_helpers_test.go
new file mode 100644
index 00000000..95836341
--- /dev/null
+++ b/pkg/tf2pulumi/convert/model_helpers_test.go
@@ -0,0 +1,71 @@
+// Copyright 2016-2021, Pulumi Corporation.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package convert
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/zclconf/go-cty/cty"
+
+	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2/model"
+)
+
+func TestSetConfigBlockType(t *testing.T) {
+	check := func(name string, ty model.Type, expectError bool) {
+		t.Run(name, func(t *testing.T) {
+			block := &model.Block{Type: "config", Labels: []string{"x"}}
+			err := setConfigBlockType(block, ty)
+			if expectError {
+				assert.Error(t, err)
+			} else {
+				assert.NoError(t, err)
+				assert.Equal(t, fmt.Sprintf("%v", ty), block.Labels[1])
+			}
+		})
+	}
+
+	checkOk := func(name string, ty model.Type) {
+		check(name, ty, false)
+	}
+
+	checkError := func(name string, ty model.Type) {
+		check(name, ty, true)
+	}
+
+	checkOk("intType", model.IntType)
+	checkOk("boolType", model.BoolType)
+	checkOk("objType", model.NewObjectType(map[string]model.Type{"foo": model.IntType}))
+
+	// below we expect errors - this may improve in the future and
+	// stop failing; including to demonstrate the reason for why
+	// `setConfigBlockType` exists
+
+	constType := model.NewConstType(model.IntType, cty.NumberIntVal(1))
+	checkError("constType", constType)
+
+	objTypeWithConst := model.NewObjectType(map[string]model.Type{"foo": constType})
+	checkError("objectTypeWithConstType", objTypeWithConst)
+}
+
+func TestGeneralizeConstType(t *testing.T) {
+	constType := model.NewConstType(model.IntType, cty.NumberIntVal(1))
+	assert.True(t, generalizeConstType(constType).Equals(model.IntType))
+
+	objType := model.NewObjectType(map[string]model.Type{"foo": model.IntType})
+	objTypeWithConst := model.NewObjectType(map[string]model.Type{"foo": constType})
+	assert.True(t, generalizeConstType(objTypeWithConst).Equals(objType))
+}
diff --git a/pkg/tf2pulumi/internal/config/append_test.go b/pkg/tf2pulumi/internal/config/append_test.go
index 853a460b..00f5a902 100644
--- a/pkg/tf2pulumi/internal/config/append_test.go
+++ b/pkg/tf2pulumi/internal/config/append_test.go
@@ -19,22 +19,22 @@ func TestAppend(t *testing.T) {
 					Name: "foo",
 				},
 				Modules: []*Module{
-					&Module{Name: "foo"},
+					{Name: "foo"},
 				},
 				Outputs: []*Output{
-					&Output{Name: "foo"},
+					{Name: "foo"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "foo"},
+					{Name: "foo"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "foo"},
+					{Name: "foo"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "foo"},
+					{Name: "foo"},
 				},
 				Locals: []*Local{
-					&Local{Name: "foo"},
+					{Name: "foo"},
 				},
 
 				unknownKeys: []string{"foo"},
@@ -45,22 +45,22 @@ func TestAppend(t *testing.T) {
 					Name: "bar",
 				},
 				Modules: []*Module{
-					&Module{Name: "bar"},
+					{Name: "bar"},
 				},
 				Outputs: []*Output{
-					&Output{Name: "bar"},
+					{Name: "bar"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "bar"},
+					{Name: "bar"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "bar"},
+					{Name: "bar"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "bar"},
+					{Name: "bar"},
 				},
 				Locals: []*Local{
-					&Local{Name: "bar"},
+					{Name: "bar"},
 				},
 
 				unknownKeys: []string{"bar"},
@@ -71,28 +71,28 @@ func TestAppend(t *testing.T) {
 					Name: "bar",
 				},
 				Modules: []*Module{
-					&Module{Name: "foo"},
-					&Module{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Outputs: []*Output{
-					&Output{Name: "foo"},
-					&Output{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "foo"},
-					&ProviderConfig{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "foo"},
-					&Resource{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "foo"},
-					&Variable{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Locals: []*Local{
-					&Local{Name: "foo"},
-					&Local{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 
 				unknownKeys: []string{"foo", "bar"},
diff --git a/pkg/tf2pulumi/internal/config/config_test.go b/pkg/tf2pulumi/internal/config/config_test.go
index 32d39522..f384ccce 100644
--- a/pkg/tf2pulumi/internal/config/config_test.go
+++ b/pkg/tf2pulumi/internal/config/config_test.go
@@ -98,7 +98,7 @@ func TestConfigCount_list(t *testing.T) {
 
 	// The key is to interpolate so it doesn't fail parsing
 	c.Resources[0].RawCount.Interpolate(map[string]ast.Variable{
-		"var.list": ast.Variable{
+		"var.list": {
 			Value: []ast.Variable{},
 			Type:  ast.TypeList,
 		},
@@ -165,10 +165,10 @@ func TestNameRegexp(t *testing.T) {
 
 func TestProviderConfigName(t *testing.T) {
 	pcs := []*ProviderConfig{
-		&ProviderConfig{Name: "aw"},
-		&ProviderConfig{Name: "aws"},
-		&ProviderConfig{Name: "a"},
-		&ProviderConfig{Name: "gce_"},
+		{Name: "aw"},
+		{Name: "aws"},
+		{Name: "a"},
+		{Name: "gce_"},
 	}
 
 	n := ProviderConfigName("aws_instance", pcs)
diff --git a/pkg/tf2pulumi/internal/config/interpolate_funcs_test.go b/pkg/tf2pulumi/internal/config/interpolate_funcs_test.go
index 9895ba8c..5896aad3 100644
--- a/pkg/tf2pulumi/internal/config/interpolate_funcs_test.go
+++ b/pkg/tf2pulumi/internal/config/interpolate_funcs_test.go
@@ -1426,16 +1426,16 @@ func TestInterpolateFuncJoin(t *testing.T) {
 func TestInterpolateFuncJSONEncode(t *testing.T) {
 	testFunction(t, testFunctionConfig{
 		Vars: map[string]ast.Variable{
-			"easy": ast.Variable{
+			"easy": {
 				Value: "test",
 				Type:  ast.TypeString,
 			},
-			"hard": ast.Variable{
+			"hard": {
 				Value: " foo \\ \n \t \" bar ",
 				Type:  ast.TypeString,
 			},
 			"list": interfaceToVariableSwallowError([]string{"foo", "bar\tbaz"}),
-			"emptylist": ast.Variable{
+			"emptylist": {
 				Value: []ast.Variable{},
 				Type:  ast.TypeList,
 			},
@@ -1756,7 +1756,7 @@ func TestInterpolateFuncSlice(t *testing.T) {
 func TestInterpolateFuncSort(t *testing.T) {
 	testFunction(t, testFunctionConfig{
 		Vars: map[string]ast.Variable{
-			"var.strings": ast.Variable{
+			"var.strings": {
 				Type: ast.TypeList,
 				Value: []ast.Variable{
 					{Type: ast.TypeString, Value: "c"},
@@ -1764,7 +1764,7 @@ func TestInterpolateFuncSort(t *testing.T) {
 					{Type: ast.TypeString, Value: "b"},
 				},
 			},
-			"var.notstrings": ast.Variable{
+			"var.notstrings": {
 				Type: ast.TypeList,
 				Value: []ast.Variable{
 					{Type: ast.TypeList, Value: []ast.Variable{}},
@@ -1847,7 +1847,7 @@ func TestInterpolateFuncLookup(t *testing.T) {
 					},
 				},
 			},
-			"var.map_of_lists": ast.Variable{
+			"var.map_of_lists": {
 				Type: ast.TypeMap,
 				Value: map[string]ast.Variable{
 					"bar": {
@@ -1917,20 +1917,20 @@ func TestInterpolateFuncLookup(t *testing.T) {
 func TestInterpolateFuncKeys(t *testing.T) {
 	testFunction(t, testFunctionConfig{
 		Vars: map[string]ast.Variable{
-			"var.foo": ast.Variable{
+			"var.foo": {
 				Type: ast.TypeMap,
 				Value: map[string]ast.Variable{
-					"bar": ast.Variable{
+					"bar": {
 						Value: "baz",
 						Type:  ast.TypeString,
 					},
-					"qux": ast.Variable{
+					"qux": {
 						Value: "quack",
 						Type:  ast.TypeString,
 					},
 				},
 			},
-			"var.str": ast.Variable{
+			"var.str": {
 				Value: "astring",
 				Type:  ast.TypeString,
 			},
@@ -1971,30 +1971,30 @@ func TestInterpolateFuncKeys(t *testing.T) {
 func TestInterpolateFuncKeyValOrder(t *testing.T) {
 	testFunction(t, testFunctionConfig{
 		Vars: map[string]ast.Variable{
-			"var.foo": ast.Variable{
+			"var.foo": {
 				Type: ast.TypeMap,
 				Value: map[string]ast.Variable{
-					"D": ast.Variable{
+					"D": {
 						Value: "2",
 						Type:  ast.TypeString,
 					},
-					"C": ast.Variable{
+					"C": {
 						Value: "Y",
 						Type:  ast.TypeString,
 					},
-					"A": ast.Variable{
+					"A": {
 						Value: "X",
 						Type:  ast.TypeString,
 					},
-					"10": ast.Variable{
+					"10": {
 						Value: "Z",
 						Type:  ast.TypeString,
 					},
-					"1": ast.Variable{
+					"1": {
 						Value: "4",
 						Type:  ast.TypeString,
 					},
-					"3": ast.Variable{
+					"3": {
 						Value: "W",
 						Type:  ast.TypeString,
 					},
@@ -2020,20 +2020,20 @@ func TestInterpolateFuncKeyValOrder(t *testing.T) {
 func TestInterpolateFuncValues(t *testing.T) {
 	testFunction(t, testFunctionConfig{
 		Vars: map[string]ast.Variable{
-			"var.foo": ast.Variable{
+			"var.foo": {
 				Type: ast.TypeMap,
 				Value: map[string]ast.Variable{
-					"bar": ast.Variable{
+					"bar": {
 						Value: "quack",
 						Type:  ast.TypeString,
 					},
-					"qux": ast.Variable{
+					"qux": {
 						Value: "baz",
 						Type:  ast.TypeString,
 					},
 				},
 			},
-			"var.str": ast.Variable{
+			"var.str": {
 				Value: "astring",
 				Type:  ast.TypeString,
 			},
@@ -2727,17 +2727,17 @@ func TestInterpolateFuncURLEncode(t *testing.T) {
 func TestInterpolateFuncTranspose(t *testing.T) {
 	testFunction(t, testFunctionConfig{
 		Vars: map[string]ast.Variable{
-			"var.map": ast.Variable{
+			"var.map": {
 				Type: ast.TypeMap,
 				Value: map[string]ast.Variable{
-					"key1": ast.Variable{
+					"key1": {
 						Type: ast.TypeList,
 						Value: []ast.Variable{
 							{Type: ast.TypeString, Value: "a"},
 							{Type: ast.TypeString, Value: "b"},
 						},
 					},
-					"key2": ast.Variable{
+					"key2": {
 						Type: ast.TypeList,
 						Value: []ast.Variable{
 							{Type: ast.TypeString, Value: "a"},
@@ -2745,21 +2745,21 @@ func TestInterpolateFuncTranspose(t *testing.T) {
 							{Type: ast.TypeString, Value: "c"},
 						},
 					},
-					"key3": ast.Variable{
+					"key3": {
 						Type: ast.TypeList,
 						Value: []ast.Variable{
 							{Type: ast.TypeString, Value: "c"},
 						},
 					},
-					"key4": ast.Variable{
+					"key4": {
 						Type:  ast.TypeList,
 						Value: []ast.Variable{},
 					},
 				}},
-			"var.badmap": ast.Variable{
+			"var.badmap": {
 				Type: ast.TypeMap,
 				Value: map[string]ast.Variable{
-					"key1": ast.Variable{
+					"key1": {
 						Type: ast.TypeList,
 						Value: []ast.Variable{
 							{Type: ast.TypeList, Value: []ast.Variable{}},
@@ -2767,10 +2767,10 @@ func TestInterpolateFuncTranspose(t *testing.T) {
 						},
 					},
 				}},
-			"var.worsemap": ast.Variable{
+			"var.worsemap": {
 				Type: ast.TypeMap,
 				Value: map[string]ast.Variable{
-					"key1": ast.Variable{
+					"key1": {
 						Type:  ast.TypeString,
 						Value: "not-a-list",
 					},
@@ -2855,11 +2855,11 @@ func TestInterpolateFuncAbs(t *testing.T) {
 func TestInterpolateFuncRsaDecrypt(t *testing.T) {
 	testFunction(t, testFunctionConfig{
 		Vars: map[string]ast.Variable{
-			"var.cipher_base64": ast.Variable{
+			"var.cipher_base64": {
 				Type:  ast.TypeString,
 				Value: "eczGaDhXDbOFRZGhjx2etVzWbRqWDlmq0bvNt284JHVbwCgObiuyX9uV0LSAMY707IEgMkExJqXmsB4OWKxvB7epRB9G/3+F+pcrQpODlDuL9oDUAsa65zEpYF0Wbn7Oh7nrMQncyUPpyr9WUlALl0gRWytOA23S+y5joa4M34KFpawFgoqTu/2EEH4Xl1zo+0fy73fEto+nfkUY+meuyGZ1nUx/+DljP7ZqxHBFSlLODmtuTMdswUbHbXbWneW51D7Jm7xB8nSdiA2JQNK5+Sg5x8aNfgvFTt/m2w2+qpsyFa5Wjeu6fZmXSl840CA07aXbk9vN4I81WmJyblD/ZA==",
 			},
-			"var.private_key": ast.Variable{
+			"var.private_key": {
 				Type: ast.TypeString,
 				Value: `
 -----BEGIN RSA PRIVATE KEY-----
@@ -2891,7 +2891,7 @@ T8UYnFu6RzkixElTf2rseEav7rkdKkI3LAeIZy7B0HulKKsmqVQ7
 -----END RSA PRIVATE KEY-----
 `,
 			},
-			"var.wrong_private_key": ast.Variable{
+			"var.wrong_private_key": {
 				Type: ast.TypeString,
 				Value: `
 -----BEGIN RSA PRIVATE KEY-----
diff --git a/pkg/tf2pulumi/internal/config/merge_test.go b/pkg/tf2pulumi/internal/config/merge_test.go
index ae7c7eec..f4967997 100644
--- a/pkg/tf2pulumi/internal/config/merge_test.go
+++ b/pkg/tf2pulumi/internal/config/merge_test.go
@@ -20,22 +20,22 @@ func TestMerge(t *testing.T) {
 					Name: "foo",
 				},
 				Modules: []*Module{
-					&Module{Name: "foo"},
+					{Name: "foo"},
 				},
 				Outputs: []*Output{
-					&Output{Name: "foo"},
+					{Name: "foo"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "foo"},
+					{Name: "foo"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "foo"},
+					{Name: "foo"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "foo"},
+					{Name: "foo"},
 				},
 				Locals: []*Local{
-					&Local{Name: "foo"},
+					{Name: "foo"},
 				},
 
 				unknownKeys: []string{"foo"},
@@ -46,22 +46,22 @@ func TestMerge(t *testing.T) {
 					Name: "bar",
 				},
 				Modules: []*Module{
-					&Module{Name: "bar"},
+					{Name: "bar"},
 				},
 				Outputs: []*Output{
-					&Output{Name: "bar"},
+					{Name: "bar"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "bar"},
+					{Name: "bar"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "bar"},
+					{Name: "bar"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "bar"},
+					{Name: "bar"},
 				},
 				Locals: []*Local{
-					&Local{Name: "bar"},
+					{Name: "bar"},
 				},
 
 				unknownKeys: []string{"bar"},
@@ -72,28 +72,28 @@ func TestMerge(t *testing.T) {
 					Name: "bar",
 				},
 				Modules: []*Module{
-					&Module{Name: "foo"},
-					&Module{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Outputs: []*Output{
-					&Output{Name: "foo"},
-					&Output{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "foo"},
-					&ProviderConfig{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "foo"},
-					&Resource{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "foo"},
-					&Variable{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Locals: []*Local{
-					&Local{Name: "foo"},
-					&Local{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 
 				unknownKeys: []string{"foo", "bar"},
@@ -108,20 +108,20 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Outputs: []*Output{
-					&Output{Name: "foo"},
+					{Name: "foo"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "foo"},
+					{Name: "foo"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "foo"},
+					{Name: "foo"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "foo", Default: "foo"},
-					&Variable{Name: "foo"},
+					{Name: "foo", Default: "foo"},
+					{Name: "foo"},
 				},
 				Locals: []*Local{
-					&Local{Name: "foo"},
+					{Name: "foo"},
 				},
 
 				unknownKeys: []string{"foo"},
@@ -129,20 +129,20 @@ func TestMerge(t *testing.T) {
 
 			&Config{
 				Outputs: []*Output{
-					&Output{Name: "bar"},
+					{Name: "bar"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "bar"},
+					{Name: "bar"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "bar"},
+					{Name: "bar"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "foo", Default: "bar"},
-					&Variable{Name: "bar"},
+					{Name: "foo", Default: "bar"},
+					{Name: "bar"},
 				},
 				Locals: []*Local{
-					&Local{Name: "foo"},
+					{Name: "foo"},
 				},
 
 				unknownKeys: []string{"bar"},
@@ -150,25 +150,25 @@ func TestMerge(t *testing.T) {
 
 			&Config{
 				Outputs: []*Output{
-					&Output{Name: "foo"},
-					&Output{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Name: "foo"},
-					&ProviderConfig{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Resources: []*Resource{
-					&Resource{Name: "foo"},
-					&Resource{Name: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Variables: []*Variable{
-					&Variable{Name: "foo", Default: "bar"},
-					&Variable{Name: "foo"},
-					&Variable{Name: "bar"},
+					{Name: "foo", Default: "bar"},
+					{Name: "foo"},
+					{Name: "bar"},
 				},
 				Locals: []*Local{
-					&Local{Name: "foo"},
-					&Local{Name: "foo"},
+					{Name: "foo"},
+					{Name: "foo"},
 				},
 
 				unknownKeys: []string{"foo", "bar"},
@@ -212,13 +212,13 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Alias: "foo"},
+					{Alias: "foo"},
 				},
 			},
 			&Config{},
 			&Config{
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Alias: "foo"},
+					{Alias: "foo"},
 				},
 			},
 			false,
@@ -228,12 +228,12 @@ func TestMerge(t *testing.T) {
 			&Config{},
 			&Config{
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Alias: "foo"},
+					{Alias: "foo"},
 				},
 			},
 			&Config{
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Alias: "foo"},
+					{Alias: "foo"},
 				},
 			},
 			false,
@@ -242,17 +242,17 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Alias: "bar"},
+					{Alias: "bar"},
 				},
 			},
 			&Config{
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Alias: "foo"},
+					{Alias: "foo"},
 				},
 			},
 			&Config{
 				ProviderConfigs: []*ProviderConfig{
-					&ProviderConfig{Alias: "foo"},
+					{Alias: "foo"},
 				},
 			},
 			false,
@@ -262,13 +262,13 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Variables: []*Variable{
-					&Variable{DeclaredType: "foo"},
+					{DeclaredType: "foo"},
 				},
 			},
 			&Config{},
 			&Config{
 				Variables: []*Variable{
-					&Variable{DeclaredType: "foo"},
+					{DeclaredType: "foo"},
 				},
 			},
 			false,
@@ -278,12 +278,12 @@ func TestMerge(t *testing.T) {
 			&Config{},
 			&Config{
 				Variables: []*Variable{
-					&Variable{DeclaredType: "foo"},
+					{DeclaredType: "foo"},
 				},
 			},
 			&Config{
 				Variables: []*Variable{
-					&Variable{DeclaredType: "foo"},
+					{DeclaredType: "foo"},
 				},
 			},
 			false,
@@ -292,17 +292,17 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Variables: []*Variable{
-					&Variable{DeclaredType: "bar"},
+					{DeclaredType: "bar"},
 				},
 			},
 			&Config{
 				Variables: []*Variable{
-					&Variable{DeclaredType: "foo"},
+					{DeclaredType: "foo"},
 				},
 			},
 			&Config{
 				Variables: []*Variable{
-					&Variable{DeclaredType: "foo"},
+					{DeclaredType: "foo"},
 				},
 			},
 			false,
@@ -312,13 +312,13 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Outputs: []*Output{
-					&Output{Description: "foo"},
+					{Description: "foo"},
 				},
 			},
 			&Config{},
 			&Config{
 				Outputs: []*Output{
-					&Output{Description: "foo"},
+					{Description: "foo"},
 				},
 			},
 			false,
@@ -328,12 +328,12 @@ func TestMerge(t *testing.T) {
 			&Config{},
 			&Config{
 				Outputs: []*Output{
-					&Output{Description: "foo"},
+					{Description: "foo"},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{Description: "foo"},
+					{Description: "foo"},
 				},
 			},
 			false,
@@ -342,17 +342,17 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Outputs: []*Output{
-					&Output{Description: "bar"},
+					{Description: "bar"},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{Description: "foo"},
+					{Description: "foo"},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{Description: "foo"},
+					{Description: "foo"},
 				},
 			},
 			false,
@@ -362,13 +362,13 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Outputs: []*Output{
-					&Output{DependsOn: []string{"foo"}},
+					{DependsOn: []string{"foo"}},
 				},
 			},
 			&Config{},
 			&Config{
 				Outputs: []*Output{
-					&Output{DependsOn: []string{"foo"}},
+					{DependsOn: []string{"foo"}},
 				},
 			},
 			false,
@@ -378,12 +378,12 @@ func TestMerge(t *testing.T) {
 			&Config{},
 			&Config{
 				Outputs: []*Output{
-					&Output{DependsOn: []string{"foo"}},
+					{DependsOn: []string{"foo"}},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{DependsOn: []string{"foo"}},
+					{DependsOn: []string{"foo"}},
 				},
 			},
 			false,
@@ -392,17 +392,17 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Outputs: []*Output{
-					&Output{DependsOn: []string{"bar"}},
+					{DependsOn: []string{"bar"}},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{DependsOn: []string{"foo"}},
+					{DependsOn: []string{"foo"}},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{DependsOn: []string{"foo"}},
+					{DependsOn: []string{"foo"}},
 				},
 			},
 			false,
@@ -412,13 +412,13 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Outputs: []*Output{
-					&Output{Sensitive: true},
+					{Sensitive: true},
 				},
 			},
 			&Config{},
 			&Config{
 				Outputs: []*Output{
-					&Output{Sensitive: true},
+					{Sensitive: true},
 				},
 			},
 			false,
@@ -428,12 +428,12 @@ func TestMerge(t *testing.T) {
 			&Config{},
 			&Config{
 				Outputs: []*Output{
-					&Output{Sensitive: true},
+					{Sensitive: true},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{Sensitive: true},
+					{Sensitive: true},
 				},
 			},
 			false,
@@ -442,17 +442,17 @@ func TestMerge(t *testing.T) {
 		{
 			&Config{
 				Outputs: []*Output{
-					&Output{Sensitive: false},
+					{Sensitive: false},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{Sensitive: true},
+					{Sensitive: true},
 				},
 			},
 			&Config{
 				Outputs: []*Output{
-					&Output{Sensitive: true},
+					{Sensitive: true},
 				},
 			},
 			false,
diff --git a/pkg/tf2pulumi/internal/config/raw_config_test.go b/pkg/tf2pulumi/internal/config/raw_config_test.go
index a4c89240..f3045fa9 100644
--- a/pkg/tf2pulumi/internal/config/raw_config_test.go
+++ b/pkg/tf2pulumi/internal/config/raw_config_test.go
@@ -43,7 +43,7 @@ func TestRawConfig_basic(t *testing.T) {
 	}
 
 	vars := map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: "baz",
 			Type:  ast.TypeString,
 		},
@@ -76,7 +76,7 @@ func TestRawConfig_double(t *testing.T) {
 	}
 
 	vars := map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: "baz",
 			Type:  ast.TypeString,
 		},
@@ -95,7 +95,7 @@ func TestRawConfig_double(t *testing.T) {
 	}
 
 	vars = map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: "what",
 			Type:  ast.TypeString,
 		},
@@ -159,11 +159,11 @@ func TestRawConfig_merge(t *testing.T) {
 
 	{
 		vars := map[string]ast.Variable{
-			"var.foo": ast.Variable{
+			"var.foo": {
 				Value: "foovalue",
 				Type:  ast.TypeString,
 			},
-			"var.bar": ast.Variable{
+			"var.bar": {
 				Value: "nope",
 				Type:  ast.TypeString,
 			},
@@ -185,11 +185,11 @@ func TestRawConfig_merge(t *testing.T) {
 
 	{
 		vars := map[string]ast.Variable{
-			"var.bar": ast.Variable{
+			"var.bar": {
 				Value: "barvalue",
 				Type:  ast.TypeString,
 			},
-			"var.baz": ast.Variable{
+			"var.baz": {
 				Value: unknownVariableValue,
 				Type:  ast.TypeUnknown,
 			},
@@ -249,7 +249,7 @@ func TestRawConfig_unknown(t *testing.T) {
 	}
 
 	vars := map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: unknownVariableValue,
 			Type:  ast.TypeUnknown,
 		},
@@ -282,7 +282,7 @@ func TestRawConfig_unknownPartial(t *testing.T) {
 	}
 
 	vars := map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: unknownVariableValue,
 			Type:  ast.TypeUnknown,
 		},
@@ -317,7 +317,7 @@ func TestRawConfig_unknownPartialList(t *testing.T) {
 	}
 
 	vars := map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: unknownVariableValue,
 			Type:  ast.TypeUnknown,
 		},
@@ -346,7 +346,7 @@ func TestRawConfig_unknownPartialList(t *testing.T) {
 func TestRawConfig_sliceIndexLoss(t *testing.T) {
 	raw := map[string]interface{}{
 		"slice": []map[string]interface{}{
-			map[string]interface{}{
+			{
 				"foo": []interface{}{"foo/${var.unknown}"},
 				"bar": []interface{}{"bar"},
 			},
@@ -354,11 +354,11 @@ func TestRawConfig_sliceIndexLoss(t *testing.T) {
 	}
 
 	vars := map[string]ast.Variable{
-		"var.unknown": ast.Variable{
+		"var.unknown": {
 			Value: unknownVariableValue,
 			Type:  ast.TypeUnknown,
 		},
-		"var.known": ast.Variable{
+		"var.known": {
 			Value: "123456",
 			Type:  ast.TypeString,
 		},
@@ -399,7 +399,7 @@ func TestRawConfigCopy(t *testing.T) {
 
 	// Interpolate the first one
 	vars := map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: "baz",
 			Type:  ast.TypeString,
 		},
@@ -420,7 +420,7 @@ func TestRawConfigCopy(t *testing.T) {
 		}
 
 		vars := map[string]ast.Variable{
-			"var.bar": ast.Variable{
+			"var.bar": {
 				Value: "qux",
 				Type:  ast.TypeString,
 			},
@@ -456,7 +456,7 @@ func TestRawConfigValue(t *testing.T) {
 	}
 
 	vars := map[string]ast.Variable{
-		"var.bar": ast.Variable{
+		"var.bar": {
 			Value: "baz",
 			Type:  ast.TypeString,
 		},
diff --git a/pkg/tfbridge/schema_test.go b/pkg/tfbridge/schema_test.go
index 0cd0f953..396ee23d 100644
--- a/pkg/tfbridge/schema_test.go
+++ b/pkg/tfbridge/schema_test.go
@@ -937,21 +937,36 @@ func TestOverridingTFSchema(t *testing.T) {
 		shimv1.NewProvider(testTFProvider),
 		map[string]interface{}{
 			"pulumi_override_tf_string_to_boolean":    MyString("true"),
+			"pulumi_override_tf_string_to_bool":       MyString("true"),
 			"pulumi_empty_tf_override":                MyString("true"),
+			"pulumi_override_tf_string_to_int":        MyString("1"),
+			"pulumi_override_tf_string_to_integer":    MyString("1"),
 			"tf_empty_string_to_pulumi_bool_override": MyString(""),
 		},
 		shimv1.NewSchemaMap(map[string]*schemav1.Schema{
 			"pulumi_override_tf_string_to_boolean":    {Type: schemav1.TypeString},
+			"pulumi_override_tf_string_to_bool":       {Type: schemav1.TypeString},
 			"pulumi_empty_tf_override":                {Type: schemav1.TypeString},
+			"pulumi_override_tf_string_to_int":        {Type: schemav1.TypeString},
+			"pulumi_override_tf_string_to_integer":    {Type: schemav1.TypeString},
 			"tf_empty_string_to_pulumi_bool_override": {Type: schemav1.TypeString},
 		}),
 		map[string]*SchemaInfo{
 			"pulumi_override_tf_string_to_boolean": {
 				Type: "boolean",
 			},
+			"pulumi_override_tf_string_to_bool": {
+				Type: "bool",
+			},
 			"pulumi_empty_tf_override": {
 				Type: "",
 			},
+			"pulumi_override_tf_string_to_int": {
+				Type: "int",
+			},
+			"pulumi_override_tf_string_to_integer": {
+				Type: "integer",
+			},
 			"tf_empty_string_to_pulumi_bool_override": {
 				Type:           "boolean",
 				MarkAsOptional: boolPointer(true),
@@ -963,7 +978,10 @@ func TestOverridingTFSchema(t *testing.T) {
 	)
 	assert.Equal(t, resource.NewPropertyMapFromMap(map[string]interface{}{
 		"pulumiOverrideTfStringToBoolean":   true,
+		"pulumiOverrideTfStringToBool":      true,
 		"pulumiEmptyTfOverride":             "true",
+		"pulumiOverrideTfStringToInt":       1,
+		"pulumiOverrideTfStringToInteger":   1,
 		"tfEmptyStringToPulumiBoolOverride": nil,
 	}), result)
 }
diff --git a/pkg/tfgen/convert_test.go b/pkg/tfgen/convert_test.go
new file mode 100644
index 00000000..0eb6c652
--- /dev/null
+++ b/pkg/tfgen/convert_test.go
@@ -0,0 +1,137 @@
+// Copyright 2016-2021, Pulumi Corporation.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package tfgen
+
+import (
+	"fmt"
+	"os"
+	"runtime"
+	"strings"
+	"testing"
+
+	"github.com/spf13/afero"
+	"github.com/stretchr/testify/require"
+
+	"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tf2pulumi/convert"
+	"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
+	"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
+)
+
+func TestConvert(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		// TODO[pulumi/pulumi-terraform-bridge#408]
+		t.Skip("Skipped on windows")
+	}
+
+	cwd, err := os.Getwd()
+	require.NoError(t, err)
+
+	pluginContext, err := plugin.NewContext(
+		nil, nil, nil, nil,
+		cwd, nil, false, nil)
+	require.NoError(t, err)
+	defer contract.IgnoreClose(pluginContext)
+
+	host := pluginContext.Host
+	loader := newLoader(host)
+	loader.emptyPackages["aws"] = true
+
+	check := func(hcl string) (map[string][]byte, convert.Diagnostics) {
+		files, diags, err := convert.Convert(convert.Options{
+			Root:                     hclToInput(t, hcl, "path"),
+			TargetLanguage:           "typescript",
+			AllowMissingProperties:   true,
+			AllowMissingVariables:    true,
+			FilterResourceNames:      true,
+			Loader:                   loader,
+			SkipResourceTypechecking: true,
+		})
+		require.NoError(t, err)
+		return files, diags
+	}
+
+	t.Run("regress cannot bind expression", func(t *testing.T) {
+		files, diags := check(`
+                  variable "region_number" {
+                    default = {
+                      us-east-1 = 1
+                    }
+                  }`)
+
+		expectedCode := `
+import * as pulumi from "@pulumi/pulumi";
+
+const config = new pulumi.Config();
+const regionNumber = config.get("regionNumber") || {
+    "us-east-1": 1,
+};`
+
+		require.False(t, diags.All.HasErrors())
+
+		require.Equal(t,
+			strings.TrimSpace(expectedCode),
+			strings.TrimSpace(string(files["index.ts"])))
+
+		// The test extended with a random resource does
+		// currently produce erroring diags about an unknown
+		// resource (bad test setup), but is included here
+		// since for some reason including the resource was
+		// needed to reproduce non-nil `err` in the orignal
+		// bug.
+		check(`
+                  variable "region_number" {
+                    default = {
+                      us-east-1 = 1
+                    }
+                  }
+
+                  resource "aws_vpc" "example" {
+                    cidr_block = cidrsubnet("10.0.0.0/8", 4, 2)
+                  }`)
+	})
+
+	t.Run("regress no empty resource plugin found", func(t *testing.T) {
+		check(`
+                  data "aws_outposts_outpost_instance_type" "example" {
+                    arn                      = data.aws_outposts_outpost.example.arn
+                    preferred_instance_types = ["m5.large", "m5.4xlarge"]
+                  }
+
+                  resource "aws_ec2_instance" "example" {
+                    # ... other configuration ...
+
+                    instance_type = data.aws_outposts_outpost_instance_type.example.instance_type
+                  }`)
+	})
+}
+
+func hclToInput(t *testing.T, hcl string, path string) afero.Fs {
+	// Fixup the HCL as necessary.
+	if fixed, ok := fixHcl(hcl); ok {
+		t.Logf("fixHcl succeeded to convert to: %s\n", fixed)
+		t.Logf("fixHcl saw original hcl as %s\n", hcl)
+		hcl = fixed
+	} else {
+		t.Logf("fixHcl left intact: %s\n", hcl)
+	}
+
+	input := afero.NewMemMapFs()
+	f, err := input.Create(fmt.Sprintf("/%s.tf", strings.ReplaceAll(path, "/", "-")))
+	require.NoError(t, err)
+	_, err = f.Write([]byte(hcl))
+	require.NoError(t, err)
+	contract.IgnoreClose(f)
+	return input
+}
diff --git a/pkg/tfshim/tfplugin5/instance_diff_test.go b/pkg/tfshim/tfplugin5/instance_diff_test.go
index 9f3648a4..20010daa 100644
--- a/pkg/tfshim/tfplugin5/instance_diff_test.go
+++ b/pkg/tfshim/tfplugin5/instance_diff_test.go
@@ -92,6 +92,7 @@ func diffTest(t *testing.T, attributes map[string]cty.Type, requiresReplace []*p
 	}
 
 	expectedDiff := &instanceDiff{
+		config:     plannedVal,
 		planned:    plannedVal,
 		attributes: expected,
 	}
@@ -102,7 +103,7 @@ func diffTest(t *testing.T, attributes map[string]cty.Type, requiresReplace []*p
 		}
 	}
 
-	actual := newInstanceDiff(priorVal, plannedVal, nil, requiresReplace)
+	actual := newInstanceDiff(plannedVal, priorVal, plannedVal, nil, requiresReplace)
 	assert.Equal(t, expectedDiff, actual)
 }
 
diff --git a/pkg/tfshim/tfplugin5/provider_test.go b/pkg/tfshim/tfplugin5/provider_test.go
index 19129dd8..408ec293 100644
--- a/pkg/tfshim/tfplugin5/provider_test.go
+++ b/pkg/tfshim/tfplugin5/provider_test.go
@@ -14,6 +14,7 @@ import (
 	"github.com/hashicorp/go-hclog"
 	goplugin "github.com/hashicorp/go-plugin"
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 
 	shim "github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfshim"
 	"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfshim/diagnostics"
@@ -49,8 +50,12 @@ func (l *testLogger) Log(level hclog.Level, msg string, args ...interface{}) {
 		hcl.Warn(msg, args...)
 	case hclog.Error:
 		hcl.Error(msg, args...)
+	default:
+		hcl.Log(level, msg, args...)
+	}
+	if s := buf.String(); s != "" {
+		l.t.Log(s)
 	}
-	l.t.Log(buf.String())
 }
 
 func (l *testLogger) Trace(msg string, args ...interface{}) {
@@ -139,9 +144,7 @@ func (l *testLogger) StandardWriter(opts *hclog.StandardLoggerOptions) io.Writer
 
 func startTestProvider(t *testing.T) (*provider, bool) {
 	testProviderPath, err := exec.LookPath("pulumi-terraform-bridge-test-provider")
-	if !assert.NoError(t, err) {
-		return nil, false
-	}
+	require.NoError(t, err)
 
 	var logger hclog.Logger
 	switch os.Getenv("TF_LOG") {
@@ -169,13 +172,10 @@ func startTestProvider(t *testing.T) (*provider, bool) {
 		Logger:           logger,
 	})
 	client, err := pluginClient.Client()
-	if !assert.NoError(t, err) {
-		return nil, false
-	}
+	require.NoError(t, err)
+
 	p, err := client.Dispense("provider")
-	if !assert.NoError(t, err) {
-		return nil, false
-	}
+	require.NoError(t, err)
 
 	provider := p.(*provider)
 	t.Cleanup(func() {
@@ -812,17 +812,13 @@ func TestDiff(t *testing.T) {
 		return
 	}
 
-	resource, ok := p.ResourcesMap().GetOk("example_resource")
-	if !assert.True(t, ok) {
-		return
-	}
+	res, ok := p.ResourcesMap().GetOk("example_resource")
+	require.True(t, ok)
 
 	err := p.Configure(p.NewResourceConfig(map[string]interface{}{
 		"config_value": "foo",
 	}))
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	cases := []struct {
 		state      map[string]interface{}
@@ -935,16 +931,12 @@ func TestDiff(t *testing.T) {
 			}
 			for k, v := range c.state {
 				val, err := goToCty(v, expected[k].Type())
-				if !assert.NoError(t, err) {
-					return
-				}
+				require.NoError(t, err)
 				expected[k] = val
 			}
 			for k, v := range c.config {
 				val, err := goToCty(v, expected[k].Type())
-				if !assert.NoError(t, err) {
-					return
-				}
+				require.NoError(t, err)
 				expected[k] = val
 			}
 
@@ -956,17 +948,15 @@ func TestDiff(t *testing.T) {
 				}
 			}
 
-			state, err := resource.InstanceState("0", c.state, nil)
-			if !assert.NoError(t, err) {
-				return
-			}
+			state, err := res.InstanceState("0", c.state, nil)
+			require.NoError(t, err)
 
 			config := p.NewResourceConfig(c.config)
+			configVal, err := goToCty(config, res.(*resource).ctyType)
+			require.NoError(t, err)
 
 			diff, err := p.Diff("example_resource", state, config)
-			if !assert.NoError(t, err) {
-				return
-			}
+			require.NoError(t, err)
 
 			var meta map[string]interface{}
 			if len(c.attributes) != 0 {
@@ -979,6 +969,7 @@ func TestDiff(t *testing.T) {
 			}
 
 			assert.Equal(t, &instanceDiff{
+				config:      configVal,
 				planned:     cty.ObjectVal(expected),
 				attributes:  c.attributes,
 				requiresNew: requiresNew,
@@ -995,16 +986,12 @@ func TestApply(t *testing.T) {
 	}
 
 	resource, ok := p.ResourcesMap().GetOk("example_resource")
-	if !assert.True(t, ok) {
-		return
-	}
+	require.True(t, ok)
 
 	err := p.Configure(p.NewResourceConfig(map[string]interface{}{
 		"config_value": "foo",
 	}))
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	cases := []struct {
 		state  map[string]interface{}
@@ -1086,30 +1073,22 @@ func TestApply(t *testing.T) {
 			}
 			for k, v := range c.state {
 				val, err := goToCty(v, expected[k].Type())
-				if !assert.NoError(t, err) {
-					return
-				}
+				require.NoError(t, err)
 				expected[k] = val
 			}
 			for k, v := range c.config {
 				val, err := goToCty(v, expected[k].Type())
-				if !assert.NoError(t, err) {
-					return
-				}
+				require.NoError(t, err)
 				expected[k] = val
 			}
 
 			state, err := resource.InstanceState("0", c.state, nil)
-			if !assert.NoError(t, err) {
-				return
-			}
+			require.NoError(t, err)
 
 			config := p.NewResourceConfig(c.config)
 
 			diff, err := p.Diff("example_resource", state, config)
-			if !assert.NoError(t, err) {
-				return
-			}
+			require.NoError(t, err)
 
 			if len(diff.Attributes()) == 0 {
 				return
@@ -1146,32 +1125,22 @@ func TestApply(t *testing.T) {
 				}
 				for k, v := range c.config {
 					val, err := goToCty(v, expected[k].Type())
-					if !assert.NoError(t, err) {
-						return
-					}
+					require.NoError(t, err)
 					expected[k] = val
 				}
 
 				state, err = resource.InstanceState("", map[string]interface{}{}, nil)
-				if !assert.NoError(t, err) {
-					return
-				}
+				require.NoError(t, err)
 
 				diff, err = p.Diff("example_resource", state, config)
-				if !assert.NoError(t, err) {
-					return
-				}
+				require.NoError(t, err)
 			}
 
 			state, err = p.Apply("example_resource", state, diff)
-			if !assert.NoError(t, err) {
-				return
-			}
+			require.NoError(t, err)
 
 			expectedObject, err := ctyToGo(cty.ObjectVal(expected))
-			if !assert.NoError(t, err) {
-				return
-			}
+			require.NoError(t, err)
 
 			assert.Equal(t, &instanceState{
 				resourceType: "example_resource",
@@ -1195,16 +1164,12 @@ func TestRefresh(t *testing.T) {
 	}
 
 	resource, ok := p.ResourcesMap().GetOk("example_resource")
-	if !assert.True(t, ok) {
-		return
-	}
+	require.True(t, ok)
 
 	err := p.Configure(p.NewResourceConfig(map[string]interface{}{
 		"config_value": "foo",
 	}))
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	meta := map[string]interface{}{
 		timeoutsKey: map[string]interface{}{
@@ -1214,9 +1179,7 @@ func TestRefresh(t *testing.T) {
 	}
 
 	state, err := resource.InstanceState("0", map[string]interface{}{}, meta)
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	expected := map[string]cty.Value{
 		"id": cty.StringVal("0"),
@@ -1248,14 +1211,10 @@ func TestRefresh(t *testing.T) {
 	}
 
 	state, err = p.Refresh("example_resource", state)
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	expectedObject, err := ctyToGo(cty.ObjectVal(expected))
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	assert.Equal(t, &instanceState{
 		resourceType: "example_resource",
@@ -1276,9 +1235,7 @@ func TestReadDataDiff(t *testing.T) {
 	})
 
 	diff, err := p.ReadDataDiff("example_resource", config)
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	expected := cty.ObjectVal(map[string]cty.Value{
 		"id":                    cty.NullVal(cty.String),
@@ -1311,14 +1268,10 @@ func TestReadDataApply(t *testing.T) {
 	})
 
 	diff, err := p.ReadDataDiff("example_resource", config)
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	state, err := p.ReadDataApply("example_resource", diff)
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	expected := cty.ObjectVal(map[string]cty.Value{
 		"id":                    cty.StringVal("0"),
@@ -1346,9 +1299,7 @@ func TestReadDataApply(t *testing.T) {
 		"string_with_bad_interpolation": cty.StringVal("some ${interpolated:value} with syntax errors"),
 	})
 	expectedObject, err := ctyToGo(expected)
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	assert.Equal(t, &instanceState{
 		resourceType: "example_resource",
@@ -1364,22 +1315,14 @@ func TestImportResourceState(t *testing.T) {
 	}
 
 	resource, ok := p.ResourcesMap().GetOk("example_resource")
-	if !assert.True(t, ok) {
-		return
-	}
+	require.True(t, ok)
 
 	importer := resource.Importer()
-	if !assert.NotNil(t, importer) {
-		return
-	}
+	require.NotNil(t, importer)
 
 	states, err := importer("example_resource", "0", nil)
-	if !assert.NoError(t, err) {
-		return
-	}
-	if !assert.Len(t, states, 1) {
-		return
-	}
+	require.NoError(t, err)
+	require.Len(t, states, 1)
 	state := states[0]
 
 	expected := cty.ObjectVal(map[string]cty.Value{
@@ -1401,9 +1344,7 @@ func TestImportResourceState(t *testing.T) {
 		"string_with_bad_interpolation": cty.NullVal(cty.String),
 	})
 	expectedObject, err := ctyToGo(expected)
-	if !assert.NoError(t, err) {
-		return
-	}
+	require.NoError(t, err)
 
 	assert.Equal(t, &instanceState{
 		resourceType: "example_resource",