Repository: googleapis/google-cloudevents-python (language: python)

Issue:
Tests for the Python Unmarshaling Library are Failing
## Expected Behavior

All 6 tests auto-generated for the Python unmarshaling library should pass.

## Actual Behavior

4 of 6 tests are passing; 2 fail due to schema issues.

## Specifics

Per the protobuf event definitions, the `request` field of the `AuditLog` message (`proto/google/events/cloud/audit/v1/data.proto`) should be a `Struct`, which corresponds to free-form k-v pairs (dictionaries) in Python. However, after translation, the converted JSON schema (`jsonschema/google/events/cloud/audit/v1/LogEntryData.json`) has the same field specified as an object with one attribute, `fields`. This representation no longer matches the test data (`testdata/google/events/cloud/audit/v1/LogEntryData-pubsubCreateTopic.json`, which has two k-v pairs, `@type` and `name`), hence the failed tests. 

## Steps to Reproduce the Problem

Run `pytest` at the root of the Python Unmarshaling Library repository.



Discussion / hints:
I'm not sure what specific change or expected behavior you're wishing to see.

Can you expand on the specific proto/json files by including a sample here?

I believe properties like `@type` are purposefully not included in CAL.
@michaelawyu If you're free can you schedule some time with me to resolve this issue?
Transferring this issue to the python repo. There's not enough detail for me to triage this issue.
Still an issue.
Correct - the autogenerated tests are failing:

```
AttributeError: 'StorageObjectData' object has no attribute 'crc32c'

AttributeError: 'Request' object has no attribute 'name'
```

https://github.com/googleapis/google-cloudevents-python/pull/21


The first problem was that the sample data was passing in 'crc32c' when it should have been 'crc32C'.  If you look [here](https://github.com/googleapis/google-cloudevents-python/blob/master/src/google/events/cloud/storage/v1/StorageObjectData.py#L140), you'll see  it expressed as `crc32_c`.  Whatever is expressed in snake case in javascript will be expressed as an underscore in Python, so when you change the sample data to a capital `C`, then it maps properly. 

I guess this sample data was auto-generated?  I'll follow up on that but have created a PR to fix the test for now. 
Can confirm the 2nd failing test is as described in the original post above.
The easy one was fixed: https://github.com/googleapis/google-cloudevents-python/pull/61.  Following up with the Yoshi team to try to understand the behavior of the Struct proto -> python API.  
Talked to Grant -- the library should probably be regenerated and from there we should look at the generation script to understand why it's translating the `Struct` the way it is. 
@parthea Can you verify whether this is still happening or not?

Fix patch:
diff --git a/README.md b/README.md
index 1ae010d..bce2c7c 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,17 @@
 # Google CloudEvents - Python
 
-[![PyPI version](https://badge.fury.io/py/google-events.svg)](https://badge.fury.io/py/google-events)
-
 This library provides classes of common event types used with Google services.
 At this moment the following types are available:
 
 | Package | Python Class | Description |
 | ------------- | ------------- | ------------- |
 | google.events.cloud.scheduler.v1 | SchedulerJobData | Scheduler job data. |
-| google.events.firebase.database.v1 | ReferenceEventData | The data within all Firebase Real Time Database reference events. |
+| google.events.firebase.firebasealerts.v1 | AlertData | The data within all Firebase Alerts. |
 | google.events.cloud.pubsub.v1 | MessagePublishedData | The event data when a message is published to a topic. |
+| google.events.firebase.database.v1 | ReferenceEventData | The data within all Firebase Real Time Database reference events. |
 | google.events.firebase.remoteconfig.v1 | RemoteConfigEventData | The data within all Firebase Remote Config events. |
 | google.events.firebase.auth.v1 | AuthEventData | The data within all Firebase Auth events. |
+| google.events.firebase.testlab.v1 | TestMatrixEventData | The data within all Firebase test matrix events. |
 | google.events.cloud.storage.v1 | StorageObjectData | An object within Google Cloud Storage. |
 | google.events.cloud.firestore.v1 | DocumentEventData | The data within all Firestore document events. |
 | google.events.firebase.analytics.v1 | AnalyticsLogData | The data within Firebase Analytics log events. |
diff --git a/gen/package-lock.json b/gen/package-lock.json
new file mode 100644
index 0000000..e431b31
--- /dev/null
+++ b/gen/package-lock.json
@@ -0,0 +1,5576 @@
+{
+  "name": "gen",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.12.11",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.16.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+      "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+      "dev": true
+    },
+    "@babel/highlight": {
+      "version": "7.16.10",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.16.7",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "color-convert": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+          "dev": true,
+          "requires": {
+            "color-name": "1.1.3"
+          }
+        },
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "@eslint/eslintrc": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+      "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.4",
+        "debug": "^4.1.1",
+        "espree": "^7.3.0",
+        "globals": "^13.9.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^3.13.1",
+        "minimatch": "^3.0.4",
+        "strip-json-comments": "^3.1.1"
+      },
+      "dependencies": {
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        }
+      }
+    },
+    "@humanwhocodes/config-array": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+      "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+      "dev": true,
+      "requires": {
+        "@humanwhocodes/object-schema": "^1.2.0",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "dev": true
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@sindresorhus/is": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+      "dev": true
+    },
+    "@szmarczak/http-timer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+      "dev": true,
+      "requires": {
+        "defer-to-connect": "^1.0.1"
+      }
+    },
+    "@types/json-schema": {
+      "version": "7.0.9",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+      "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+      "dev": true
+    },
+    "@types/minimist": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "16.11.22",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.22.tgz",
+      "integrity": "sha512-DYNtJWauMQ9RNpesl4aVothr97/tIJM8HbyOXJ0AYT1Z2bEjLHyfjOBPAQQVMLf8h3kSShYfNk8Wnto8B2zHUA==",
+      "dev": true
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+      "dev": true
+    },
+    "@typescript-eslint/eslint-plugin": {
+      "version": "4.33.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz",
+      "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/experimental-utils": "4.33.0",
+        "@typescript-eslint/scope-manager": "4.33.0",
+        "debug": "^4.3.1",
+        "functional-red-black-tree": "^1.0.1",
+        "ignore": "^5.1.8",
+        "regexpp": "^3.1.0",
+        "semver": "^7.3.5",
+        "tsutils": "^3.21.0"
+      }
+    },
+    "@typescript-eslint/experimental-utils": {
+      "version": "4.33.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz",
+      "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.7",
+        "@typescript-eslint/scope-manager": "4.33.0",
+        "@typescript-eslint/types": "4.33.0",
+        "@typescript-eslint/typescript-estree": "4.33.0",
+        "eslint-scope": "^5.1.1",
+        "eslint-utils": "^3.0.0"
+      }
+    },
+    "@typescript-eslint/parser": {
+      "version": "4.33.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz",
+      "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "4.33.0",
+        "@typescript-eslint/types": "4.33.0",
+        "@typescript-eslint/typescript-estree": "4.33.0",
+        "debug": "^4.3.1"
+      }
+    },
+    "@typescript-eslint/scope-manager": {
+      "version": "4.33.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz",
+      "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "4.33.0",
+        "@typescript-eslint/visitor-keys": "4.33.0"
+      }
+    },
+    "@typescript-eslint/types": {
+      "version": "4.33.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz",
+      "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "4.33.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz",
+      "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "4.33.0",
+        "@typescript-eslint/visitor-keys": "4.33.0",
+        "debug": "^4.3.1",
+        "globby": "^11.0.3",
+        "is-glob": "^4.0.1",
+        "semver": "^7.3.5",
+        "tsutils": "^3.21.0"
+      }
+    },
+    "@typescript-eslint/visitor-keys": {
+      "version": "4.33.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz",
+      "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "4.33.0",
+        "eslint-visitor-keys": "^2.0.0"
+      }
+    },
+    "acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true
+    },
+    "acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ansi-align": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+      "dev": true,
+      "requires": {
+        "string-width": "^4.1.0"
+      }
+    },
+    "ansi-colors": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.21.3"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.21.3",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+          "dev": true
+        }
+      }
+    },
+    "ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+    },
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "astral-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "boxen": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
+      "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
+      "dev": true,
+      "requires": {
+        "ansi-align": "^3.0.0",
+        "camelcase": "^6.2.0",
+        "chalk": "^4.1.0",
+        "cli-boxes": "^2.2.1",
+        "string-width": "^4.2.2",
+        "type-fest": "^0.20.2",
+        "widest-line": "^3.1.0",
+        "wrap-ansi": "^7.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+          "dev": true
+        }
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "cacheable-request": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+      "dev": true,
+      "requires": {
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^3.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^4.1.0",
+        "responselike": "^1.0.2"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "lowercase-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+          "dev": true
+        }
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
+    },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "map-obj": "^4.0.0",
+        "quick-lru": "^4.0.1"
+      }
+    },
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
+    },
+    "ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "dev": true
+    },
+    "cli-boxes": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+      "dev": true
+    },
+    "cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^3.1.0"
+      }
+    },
+    "cli-width": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+      "dev": true
+    },
+    "cliui": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+      "requires": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
+    "clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "dev": true,
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "configstore": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+      "dev": true,
+      "requires": {
+        "dot-prop": "^5.2.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^3.0.0",
+        "unique-string": "^2.0.0",
+        "write-file-atomic": "^3.0.0",
+        "xdg-basedir": "^4.0.0"
+      }
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "crypto-random-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+      "dev": true
+    },
+    "debug": {
+      "version": "4.3.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+      "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+      "dev": true,
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decamelize-keys": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+      "dev": true,
+      "requires": {
+        "decamelize": "^1.1.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "map-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+          "dev": true
+        }
+      }
+    },
+    "decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "dev": true,
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "defer-to-connect": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
+      "dev": true
+    },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "requires": {
+        "path-type": "^4.0.0"
+      }
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "dot-prop": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "dev": true,
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
+    },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+      "dev": true
+    },
+    "emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enquirer": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+      "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^4.1.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+    },
+    "escape-goat": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true
+    },
+    "eslint": {
+      "version": "7.32.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+      "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "7.12.11",
+        "@eslint/eslintrc": "^0.4.3",
+        "@humanwhocodes/config-array": "^0.5.0",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "enquirer": "^2.3.5",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^5.1.1",
+        "eslint-utils": "^2.1.0",
+        "eslint-visitor-keys": "^2.0.0",
+        "espree": "^7.3.1",
+        "esquery": "^1.4.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.1.2",
+        "globals": "^13.6.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.0.4",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "progress": "^2.0.0",
+        "regexpp": "^3.1.0",
+        "semver": "^7.2.1",
+        "strip-ansi": "^6.0.0",
+        "strip-json-comments": "^3.1.0",
+        "table": "^6.0.9",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "eslint-utils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          },
+          "dependencies": {
+            "eslint-visitor-keys": {
+              "version": "1.3.0",
+              "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+              "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+              "dev": true
+            }
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-config-prettier": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz",
+      "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==",
+      "dev": true
+    },
+    "eslint-plugin-es": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+      "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+      "dev": true,
+      "requires": {
+        "eslint-utils": "^2.0.0",
+        "regexpp": "^3.0.0"
+      },
+      "dependencies": {
+        "eslint-utils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-node": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+      "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+      "dev": true,
+      "requires": {
+        "eslint-plugin-es": "^3.0.0",
+        "eslint-utils": "^2.0.0",
+        "ignore": "^5.1.1",
+        "minimatch": "^3.0.4",
+        "resolve": "^1.10.1",
+        "semver": "^6.1.0"
+      },
+      "dependencies": {
+        "eslint-utils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-prettier": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
+      "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
+      "dev": true,
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
+    "eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^2.0.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+      "dev": true
+    },
+    "espree": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.4.0",
+        "acorn-jsx": "^5.3.1",
+        "eslint-visitor-keys": "^1.3.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+          "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+          "dev": true
+        }
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+          "dev": true
+        }
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      }
+    },
+    "external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      }
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.2.11",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+      "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "fastq": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      },
+      "dependencies": {
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+          "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+          "dev": true
+        }
+      }
+    },
+    "file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^3.0.4"
+      }
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dev": true,
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+      "dev": true,
+      "requires": {
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
+      }
+    },
+    "flatted": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+      "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+    },
+    "get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true
+    },
+    "glob": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "global-dirs": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+      "dev": true,
+      "requires": {
+        "ini": "2.0.0"
+      }
+    },
+    "globals": {
+      "version": "13.12.1",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz",
+      "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.20.2"
+      }
+    },
+    "globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "dev": true,
+      "requires": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
+      }
+    },
+    "got": {
+      "version": "9.6.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+      "dev": true,
+      "requires": {
+        "@sindresorhus/is": "^0.14.0",
+        "@szmarczak/http-timer": "^1.1.2",
+        "cacheable-request": "^6.0.0",
+        "decompress-response": "^3.3.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^4.1.0",
+        "lowercase-keys": "^1.0.1",
+        "mimic-response": "^1.0.1",
+        "p-cancelable": "^1.0.0",
+        "to-readable-stream": "^1.0.0",
+        "url-parse-lax": "^3.0.0"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        }
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.9",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+      "dev": true
+    },
+    "gts": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.0.tgz",
+      "integrity": "sha512-Pbj3ob1VR1IRlEVEBNtKoQ1wHOa8cZz62KEojK8Fn/qeS2ClWI4gLNfhek3lD68aZSmUEg8TFb6AHXIwUMgyqQ==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/eslint-plugin": "^4.2.0",
+        "@typescript-eslint/parser": "^4.2.0",
+        "chalk": "^4.1.0",
+        "eslint": "^7.10.0",
+        "eslint-config-prettier": "^7.0.0",
+        "eslint-plugin-node": "^11.1.0",
+        "eslint-plugin-prettier": "^3.1.4",
+        "execa": "^5.0.0",
+        "inquirer": "^7.3.3",
+        "json5": "^2.1.3",
+        "meow": "^9.0.0",
+        "ncp": "^2.0.0",
+        "prettier": "^2.1.2",
+        "rimraf": "^3.0.2",
+        "update-notifier": "^5.0.0",
+        "write-file-atomic": "^3.0.3"
+      }
+    },
+    "hard-rejection": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+      "dev": true
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true
+    },
+    "has-yarn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
+      "dev": true
+    },
+    "hosted-git-info": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+      "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "http-cache-semantics": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+      "dev": true
+    },
+    "human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "dev": true
+    },
+    "import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "import-lazy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+      "dev": true
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "ini": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+      "dev": true
+    },
+    "inquirer": {
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^3.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.19",
+        "mute-stream": "0.0.8",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.6.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "dev": true,
+      "requires": {
+        "ci-info": "^2.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-installed-globally": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+      "dev": true,
+      "requires": {
+        "global-dirs": "^3.0.0",
+        "is-path-inside": "^3.0.2"
+      }
+    },
+    "is-npm": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
+      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
+      "dev": true
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+      "dev": true
+    },
+    "is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-yarn-global": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "dev": true,
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+      "dev": true
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "keyv": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+      "dev": true,
+      "requires": {
+        "json-buffer": "3.0.0"
+      }
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
+    },
+    "latest-version": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+      "dev": true,
+      "requires": {
+        "package-json": "^6.3.0"
+      }
+    },
+    "levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      }
+    },
+    "lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+      "dev": true
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dev": true,
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "dev": true
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "lodash.truncate": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+      "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+      "dev": true
+    },
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dev": true,
+      "requires": {
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "map-obj": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+      "dev": true
+    },
+    "meow": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+      "dev": true,
+      "requires": {
+        "@types/minimist": "^1.2.0",
+        "camelcase-keys": "^6.2.2",
+        "decamelize": "^1.2.0",
+        "decamelize-keys": "^1.1.0",
+        "hard-rejection": "^2.1.0",
+        "minimist-options": "4.1.0",
+        "normalize-package-data": "^3.0.0",
+        "read-pkg-up": "^7.0.1",
+        "redent": "^3.0.0",
+        "trim-newlines": "^3.0.0",
+        "type-fest": "^0.18.0",
+        "yargs-parser": "^20.2.3"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.18.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+          "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+          "dev": true
+        },
+        "yargs-parser": {
+          "version": "20.2.9",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+          "dev": true
+        }
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+      "dev": true,
+      "requires": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.2.3"
+      }
+    },
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true
+    },
+    "mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+      "dev": true
+    },
+    "min-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "dev": true
+    },
+    "minimist-options": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+      "dev": true,
+      "requires": {
+        "arrify": "^1.0.1",
+        "is-plain-obj": "^1.1.0",
+        "kind-of": "^6.0.3"
+      }
+    },
+    "mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": true
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
+    },
+    "ncp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
+      "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
+      "dev": true
+    },
+    "normalize-package-data": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+      "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^4.0.1",
+        "is-core-module": "^2.5.0",
+        "semver": "^7.3.4",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "normalize-url": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
+      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.0.0"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "optionator": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "dev": true,
+      "requires": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.3"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "p-cancelable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true
+    },
+    "package-json": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+      "dev": true,
+      "requires": {
+        "got": "^9.6.0",
+        "registry-auth-token": "^4.0.0",
+        "registry-url": "^5.0.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
+    },
+    "prepend-http": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "dev": true
+    },
+    "prettier": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
+      "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
+      "dev": true
+    },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "pupa": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
+      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+      "dev": true,
+      "requires": {
+        "escape-goat": "^2.0.0"
+      }
+    },
+    "qt": {
+      "version": "file:quicktype-wrapper",
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "quicktype-core": "^6.0.69",
+        "recursive-readdir": "^2.2.2",
+        "yargs": "^17.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+          "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+          "requires": {
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "@babel/helper-validator-identifier": {
+          "version": "7.14.9",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+          "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g=="
+        },
+        "@babel/highlight": {
+          "version": "7.14.5",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+          "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.14.5",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "3.2.1",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+              "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+              "requires": {
+                "color-convert": "^1.9.0"
+              }
+            },
+            "chalk": {
+              "version": "2.4.2",
+              "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+              "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+              "requires": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+              }
+            },
+            "color-convert": {
+              "version": "1.9.3",
+              "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+              "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+              "requires": {
+                "color-name": "1.1.3"
+              }
+            },
+            "color-name": {
+              "version": "1.1.3",
+              "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+              "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+            },
+            "escape-string-regexp": {
+              "version": "1.0.5",
+              "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+              "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+            },
+            "has-flag": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+              "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+            },
+            "supports-color": {
+              "version": "5.5.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "@eslint/eslintrc": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+          "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+          "requires": {
+            "ajv": "^6.12.4",
+            "debug": "^4.1.1",
+            "espree": "^7.3.0",
+            "globals": "^13.9.0",
+            "ignore": "^4.0.6",
+            "import-fresh": "^3.2.1",
+            "js-yaml": "^3.13.1",
+            "minimatch": "^3.0.4",
+            "strip-json-comments": "^3.1.1"
+          },
+          "dependencies": {
+            "ignore": {
+              "version": "4.0.6",
+              "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+              "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+            }
+          }
+        },
+        "@humanwhocodes/config-array": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+          "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+          "requires": {
+            "@humanwhocodes/object-schema": "^1.2.0",
+            "debug": "^4.1.1",
+            "minimatch": "^3.0.4"
+          }
+        },
+        "@humanwhocodes/object-schema": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
+          "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w=="
+        },
+        "@mark.probst/unicode-properties": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/@mark.probst/unicode-properties/-/unicode-properties-1.1.0.tgz",
+          "integrity": "sha512-7AQsO0hMmpqDledV7AhBuSYqYPFsKP9PaltMecX9nlnsyFxqtsqUg9/pvB2L/jxvskrDrNkdKYz2KTbQznCtng==",
+          "requires": {
+            "brfs": "^1.4.0",
+            "unicode-trie": "^0.3.0"
+          }
+        },
+        "@nodelib/fs.scandir": {
+          "version": "2.1.5",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+          "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+          "requires": {
+            "@nodelib/fs.stat": "2.0.5",
+            "run-parallel": "^1.1.9"
+          }
+        },
+        "@nodelib/fs.stat": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+          "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+        },
+        "@nodelib/fs.walk": {
+          "version": "1.2.8",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+          "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+          "requires": {
+            "@nodelib/fs.scandir": "2.1.5",
+            "fastq": "^1.6.0"
+          }
+        },
+        "@sindresorhus/is": {
+          "version": "0.14.0",
+          "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+          "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+        },
+        "@szmarczak/http-timer": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+          "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+          "requires": {
+            "defer-to-connect": "^1.0.1"
+          }
+        },
+        "@types/json-schema": {
+          "version": "7.0.9",
+          "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+          "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
+        },
+        "@types/minimist": {
+          "version": "1.2.2",
+          "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+          "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ=="
+        },
+        "@types/node": {
+          "version": "16.11.6",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz",
+          "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w=="
+        },
+        "@types/normalize-package-data": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+          "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw=="
+        },
+        "@typescript-eslint/eslint-plugin": {
+          "version": "4.30.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.30.0.tgz",
+          "integrity": "sha512-NgAnqk55RQ/SD+tZFD9aPwNSeHmDHHe5rtUyhIq0ZeCWZEvo4DK9rYz7v9HDuQZFvn320Ot+AikaCKMFKLlD0g==",
+          "requires": {
+            "@typescript-eslint/experimental-utils": "4.30.0",
+            "@typescript-eslint/scope-manager": "4.30.0",
+            "debug": "^4.3.1",
+            "functional-red-black-tree": "^1.0.1",
+            "regexpp": "^3.1.0",
+            "semver": "^7.3.5",
+            "tsutils": "^3.21.0"
+          }
+        },
+        "@typescript-eslint/experimental-utils": {
+          "version": "4.30.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.30.0.tgz",
+          "integrity": "sha512-K8RNIX9GnBsv5v4TjtwkKtqMSzYpjqAQg/oSphtxf3xxdt6T0owqnpojztjjTcatSteH3hLj3t/kklKx87NPqw==",
+          "requires": {
+            "@types/json-schema": "^7.0.7",
+            "@typescript-eslint/scope-manager": "4.30.0",
+            "@typescript-eslint/types": "4.30.0",
+            "@typescript-eslint/typescript-estree": "4.30.0",
+            "eslint-scope": "^5.1.1",
+            "eslint-utils": "^3.0.0"
+          }
+        },
+        "@typescript-eslint/parser": {
+          "version": "4.30.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.30.0.tgz",
+          "integrity": "sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg==",
+          "requires": {
+            "@typescript-eslint/scope-manager": "4.30.0",
+            "@typescript-eslint/types": "4.30.0",
+            "@typescript-eslint/typescript-estree": "4.30.0",
+            "debug": "^4.3.1"
+          }
+        },
+        "@typescript-eslint/scope-manager": {
+          "version": "4.30.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz",
+          "integrity": "sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A==",
+          "requires": {
+            "@typescript-eslint/types": "4.30.0",
+            "@typescript-eslint/visitor-keys": "4.30.0"
+          }
+        },
+        "@typescript-eslint/types": {
+          "version": "4.30.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.30.0.tgz",
+          "integrity": "sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw=="
+        },
+        "@typescript-eslint/typescript-estree": {
+          "version": "4.30.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz",
+          "integrity": "sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg==",
+          "requires": {
+            "@typescript-eslint/types": "4.30.0",
+            "@typescript-eslint/visitor-keys": "4.30.0",
+            "debug": "^4.3.1",
+            "globby": "^11.0.3",
+            "is-glob": "^4.0.1",
+            "semver": "^7.3.5",
+            "tsutils": "^3.21.0"
+          }
+        },
+        "@typescript-eslint/visitor-keys": {
+          "version": "4.30.0",
+          "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz",
+          "integrity": "sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw==",
+          "requires": {
+            "@typescript-eslint/types": "4.30.0",
+            "eslint-visitor-keys": "^2.0.0"
+          }
+        },
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+        },
+        "acorn-jsx": {
+          "version": "5.3.2",
+          "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+          "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
+        },
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "ansi-align": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
+          "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+          "requires": {
+            "string-width": "^3.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+            },
+            "emoji-regex": {
+              "version": "7.0.3",
+              "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+              "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+            },
+            "is-fullwidth-code-point": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+            },
+            "string-width": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+              "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+              "requires": {
+                "emoji-regex": "^7.0.1",
+                "is-fullwidth-code-point": "^2.0.0",
+                "strip-ansi": "^5.1.0"
+              }
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "ansi-colors": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+          "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+        },
+        "ansi-escapes": {
+          "version": "4.3.2",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+          "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+          "requires": {
+            "type-fest": "^0.21.3"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.21.3",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+              "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="
+            }
+          }
+        },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "argparse": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+          "requires": {
+            "sprintf-js": "~1.0.2"
+          }
+        },
+        "array-union": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+        },
+        "arrify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+          "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+        },
+        "astral-regex": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+        },
+        "balanced-match": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+          "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+        },
+        "boxen": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz",
+          "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==",
+          "requires": {
+            "ansi-align": "^3.0.0",
+            "camelcase": "^6.2.0",
+            "chalk": "^4.1.0",
+            "cli-boxes": "^2.2.1",
+            "string-width": "^4.2.0",
+            "type-fest": "^0.20.2",
+            "widest-line": "^3.1.0",
+            "wrap-ansi": "^7.0.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "6.2.0",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+              "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg=="
+            }
+          }
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "brfs": {
+          "version": "1.6.1",
+          "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz",
+          "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==",
+          "requires": {
+            "quote-stream": "^1.0.1",
+            "resolve": "^1.1.5",
+            "static-module": "^2.2.0",
+            "through2": "^2.0.0"
+          }
+        },
+        "browser-or-node": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz",
+          "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg=="
+        },
+        "buffer-equal": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
+          "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs="
+        },
+        "buffer-from": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+          "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+        },
+        "cacheable-request": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+          "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+          "requires": {
+            "clone-response": "^1.0.2",
+            "get-stream": "^5.1.0",
+            "http-cache-semantics": "^4.0.0",
+            "keyv": "^3.0.0",
+            "lowercase-keys": "^2.0.0",
+            "normalize-url": "^4.1.0",
+            "responselike": "^1.0.2"
+          },
+          "dependencies": {
+            "get-stream": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+              "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+              "requires": {
+                "pump": "^3.0.0"
+              }
+            },
+            "lowercase-keys": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+              "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+            }
+          }
+        },
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+        },
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        },
+        "camelcase-keys": {
+          "version": "6.2.2",
+          "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+          "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+          "requires": {
+            "camelcase": "^5.3.1",
+            "map-obj": "^4.0.0",
+            "quick-lru": "^4.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "chardet": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+          "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+        },
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+        },
+        "cli-boxes": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+          "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
+        },
+        "cli-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "requires": {
+            "restore-cursor": "^3.1.0"
+          }
+        },
+        "cli-width": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+          "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
+        },
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
+          }
+        },
+        "clone-response": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+          "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+          "requires": {
+            "mimic-response": "^1.0.0"
+          }
+        },
+        "collection-utils": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz",
+          "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg=="
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+          "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+        },
+        "concat-stream": {
+          "version": "1.6.2",
+          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+          "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "inherits": "^2.0.3",
+            "readable-stream": "^2.2.2",
+            "typedarray": "^0.0.6"
+          }
+        },
+        "configstore": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+          "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "graceful-fs": "^4.1.2",
+            "make-dir": "^3.0.0",
+            "unique-string": "^2.0.0",
+            "write-file-atomic": "^3.0.0",
+            "xdg-basedir": "^4.0.0"
+          }
+        },
+        "convert-source-map": {
+          "version": "1.8.0",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+          "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+          "requires": {
+            "safe-buffer": "~5.1.1"
+          }
+        },
+        "core-util-is": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+          "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+        },
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "crypto-random-string": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+          "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+        },
+        "debug": {
+          "version": "4.3.2",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "decamelize": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+          "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+        },
+        "decamelize-keys": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+          "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+          "requires": {
+            "decamelize": "^1.1.0",
+            "map-obj": "^1.0.0"
+          },
+          "dependencies": {
+            "map-obj": {
+              "version": "1.0.1",
+              "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+              "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
+            }
+          }
+        },
+        "decompress-response": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+          "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+          "requires": {
+            "mimic-response": "^1.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+          "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+        },
+        "deep-is": {
+          "version": "0.1.3",
+          "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+          "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+        },
+        "defer-to-connect": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+          "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+        },
+        "dir-glob": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+          "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+          "requires": {
+            "path-type": "^4.0.0"
+          }
+        },
+        "doctrine": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+          "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "dot-prop": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+          "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+          "requires": {
+            "is-obj": "^2.0.0"
+          }
+        },
+        "duplexer2": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+          "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+          "requires": {
+            "readable-stream": "^2.0.2"
+          }
+        },
+        "duplexer3": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+          "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "encoding": {
+          "version": "0.1.13",
+          "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+          "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+          "requires": {
+            "iconv-lite": "^0.6.2"
+          }
+        },
+        "end-of-stream": {
+          "version": "1.4.4",
+          "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+          "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+          "requires": {
+            "once": "^1.4.0"
+          }
+        },
+        "enquirer": {
+          "version": "2.3.6",
+          "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+          "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+          "requires": {
+            "ansi-colors": "^4.1.1"
+          }
+        },
+        "error-ex": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+          "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+          "requires": {
+            "is-arrayish": "^0.2.1"
+          }
+        },
+        "escalade": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+          "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+        },
+        "escape-goat": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+          "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+        },
+        "escodegen": {
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+          "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+          "requires": {
+            "esprima": "^3.1.3",
+            "estraverse": "^4.2.0",
+            "esutils": "^2.0.2",
+            "optionator": "^0.8.1",
+            "source-map": "~0.6.1"
+          }
+        },
+        "eslint": {
+          "version": "7.32.0",
+          "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+          "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+          "requires": {
+            "@babel/code-frame": "7.12.11",
+            "@eslint/eslintrc": "^0.4.3",
+            "@humanwhocodes/config-array": "^0.5.0",
+            "ajv": "^6.10.0",
+            "chalk": "^4.0.0",
+            "cross-spawn": "^7.0.2",
+            "debug": "^4.0.1",
+            "doctrine": "^3.0.0",
+            "enquirer": "^2.3.5",
+            "escape-string-regexp": "^4.0.0",
+            "eslint-scope": "^5.1.1",
+            "eslint-utils": "^2.1.0",
+            "eslint-visitor-keys": "^2.0.0",
+            "espree": "^7.3.1",
+            "esquery": "^1.4.0",
+            "esutils": "^2.0.2",
+            "fast-deep-equal": "^3.1.3",
+            "file-entry-cache": "^6.0.1",
+            "functional-red-black-tree": "^1.0.1",
+            "glob-parent": "^5.1.2",
+            "globals": "^13.6.0",
+            "ignore": "^4.0.6",
+            "import-fresh": "^3.0.0",
+            "imurmurhash": "^0.1.4",
+            "is-glob": "^4.0.0",
+            "js-yaml": "^3.13.1",
+            "json-stable-stringify-without-jsonify": "^1.0.1",
+            "levn": "^0.4.1",
+            "lodash.merge": "^4.6.2",
+            "minimatch": "^3.0.4",
+            "natural-compare": "^1.4.0",
+            "optionator": "^0.9.1",
+            "progress": "^2.0.0",
+            "regexpp": "^3.1.0",
+            "semver": "^7.2.1",
+            "strip-ansi": "^6.0.0",
+            "strip-json-comments": "^3.1.0",
+            "table": "^6.0.9",
+            "text-table": "^0.2.0",
+            "v8-compile-cache": "^2.0.3"
+          },
+          "dependencies": {
+            "eslint-utils": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+              "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+              "requires": {
+                "eslint-visitor-keys": "^1.1.0"
+              },
+              "dependencies": {
+                "eslint-visitor-keys": {
+                  "version": "1.3.0",
+                  "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+                  "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+                }
+              }
+            },
+            "ignore": {
+              "version": "4.0.6",
+              "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+              "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+            },
+            "levn": {
+              "version": "0.4.1",
+              "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+              "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+              "requires": {
+                "prelude-ls": "^1.2.1",
+                "type-check": "~0.4.0"
+              }
+            },
+            "optionator": {
+              "version": "0.9.1",
+              "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+              "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+              "requires": {
+                "deep-is": "^0.1.3",
+                "fast-levenshtein": "^2.0.6",
+                "levn": "^0.4.1",
+                "prelude-ls": "^1.2.1",
+                "type-check": "^0.4.0",
+                "word-wrap": "^1.2.3"
+              }
+            },
+            "prelude-ls": {
+              "version": "1.2.1",
+              "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+              "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+            },
+            "type-check": {
+              "version": "0.4.0",
+              "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+              "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+              "requires": {
+                "prelude-ls": "^1.2.1"
+              }
+            }
+          }
+        },
+        "eslint-config-prettier": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz",
+          "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg=="
+        },
+        "eslint-plugin-es": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+          "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+          "requires": {
+            "eslint-utils": "^2.0.0",
+            "regexpp": "^3.0.0"
+          },
+          "dependencies": {
+            "eslint-utils": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+              "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+              "requires": {
+                "eslint-visitor-keys": "^1.1.0"
+              }
+            },
+            "eslint-visitor-keys": {
+              "version": "1.3.0",
+              "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+              "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+            }
+          }
+        },
+        "eslint-plugin-node": {
+          "version": "11.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+          "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+          "requires": {
+            "eslint-plugin-es": "^3.0.0",
+            "eslint-utils": "^2.0.0",
+            "ignore": "^5.1.1",
+            "minimatch": "^3.0.4",
+            "resolve": "^1.10.1",
+            "semver": "^6.1.0"
+          },
+          "dependencies": {
+            "eslint-utils": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+              "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+              "requires": {
+                "eslint-visitor-keys": "^1.1.0"
+              }
+            },
+            "eslint-visitor-keys": {
+              "version": "1.3.0",
+              "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+              "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+            },
+            "semver": {
+              "version": "6.3.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+            }
+          }
+        },
+        "eslint-plugin-prettier": {
+          "version": "3.4.1",
+          "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
+          "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
+          "requires": {
+            "prettier-linter-helpers": "^1.0.0"
+          }
+        },
+        "eslint-scope": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+          "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+          "requires": {
+            "esrecurse": "^4.3.0",
+            "estraverse": "^4.1.1"
+          }
+        },
+        "eslint-utils": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+          "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+          "requires": {
+            "eslint-visitor-keys": "^2.0.0"
+          }
+        },
+        "eslint-visitor-keys": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
+        },
+        "espree": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+          "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+          "requires": {
+            "acorn": "^7.4.0",
+            "acorn-jsx": "^5.3.1",
+            "eslint-visitor-keys": "^1.3.0"
+          },
+          "dependencies": {
+            "eslint-visitor-keys": {
+              "version": "1.3.0",
+              "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+              "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+            }
+          }
+        },
+        "esprima": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
+        },
+        "esquery": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+          "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+          "requires": {
+            "estraverse": "^5.1.0"
+          },
+          "dependencies": {
+            "estraverse": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+              "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+            }
+          }
+        },
+        "esrecurse": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+          "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+          "requires": {
+            "estraverse": "^5.2.0"
+          },
+          "dependencies": {
+            "estraverse": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+              "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+            }
+          }
+        },
+        "estraverse": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+          "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+        },
+        "esutils": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+          "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+        },
+        "execa": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+          "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+          "requires": {
+            "cross-spawn": "^7.0.3",
+            "get-stream": "^6.0.0",
+            "human-signals": "^2.1.0",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.1",
+            "onetime": "^5.1.2",
+            "signal-exit": "^3.0.3",
+            "strip-final-newline": "^2.0.0"
+          },
+          "dependencies": {
+            "is-stream": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+              "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+            }
+          }
+        },
+        "external-editor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+          "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+          "requires": {
+            "chardet": "^0.7.0",
+            "iconv-lite": "^0.4.24",
+            "tmp": "^0.0.33"
+          },
+          "dependencies": {
+            "iconv-lite": {
+              "version": "0.4.24",
+              "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+              "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+              "requires": {
+                "safer-buffer": ">= 2.1.2 < 3"
+              }
+            }
+          }
+        },
+        "falafel": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz",
+          "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==",
+          "requires": {
+            "acorn": "^7.1.1",
+            "foreach": "^2.0.5",
+            "isarray": "^2.0.1",
+            "object-keys": "^1.0.6"
+          },
+          "dependencies": {
+            "isarray": {
+              "version": "2.0.5",
+              "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+              "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+            }
+          }
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        },
+        "fast-diff": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+          "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w=="
+        },
+        "fast-glob": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
+          "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+          "requires": {
+            "@nodelib/fs.stat": "^2.0.2",
+            "@nodelib/fs.walk": "^1.2.3",
+            "glob-parent": "^5.1.2",
+            "merge2": "^1.3.0",
+            "micromatch": "^4.0.4"
+          }
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+          "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+        },
+        "fast-levenshtein": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+          "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+        },
+        "fastq": {
+          "version": "1.12.0",
+          "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
+          "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
+          "requires": {
+            "reusify": "^1.0.4"
+          }
+        },
+        "figures": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+          "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          },
+          "dependencies": {
+            "escape-string-regexp": {
+              "version": "1.0.5",
+              "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+              "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+            }
+          }
+        },
+        "file-entry-cache": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+          "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+          "requires": {
+            "flat-cache": "^3.0.4"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "flat-cache": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+          "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+          "requires": {
+            "flatted": "^3.1.0",
+            "rimraf": "^3.0.2"
+          }
+        },
+        "flatted": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
+          "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA=="
+        },
+        "foreach": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+          "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+          "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+        },
+        "function-bind": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+          "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+        },
+        "functional-red-black-tree": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+          "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+        },
+        "get-stream": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+          "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+        },
+        "glob": {
+          "version": "7.1.7",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+          "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "global-dirs": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
+          "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+          "requires": {
+            "ini": "2.0.0"
+          }
+        },
+        "globals": {
+          "version": "13.11.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
+          "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+          "requires": {
+            "type-fest": "^0.20.2"
+          }
+        },
+        "globby": {
+          "version": "11.0.4",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
+          "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+          "requires": {
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.1.1",
+            "ignore": "^5.1.4",
+            "merge2": "^1.3.0",
+            "slash": "^3.0.0"
+          }
+        },
+        "got": {
+          "version": "9.6.0",
+          "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+          "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+          "requires": {
+            "@sindresorhus/is": "^0.14.0",
+            "@szmarczak/http-timer": "^1.1.2",
+            "cacheable-request": "^6.0.0",
+            "decompress-response": "^3.3.0",
+            "duplexer3": "^0.1.4",
+            "get-stream": "^4.1.0",
+            "lowercase-keys": "^1.0.1",
+            "mimic-response": "^1.0.1",
+            "p-cancelable": "^1.0.0",
+            "to-readable-stream": "^1.0.0",
+            "url-parse-lax": "^3.0.0"
+          },
+          "dependencies": {
+            "get-stream": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+              "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+              "requires": {
+                "pump": "^3.0.0"
+              }
+            }
+          }
+        },
+        "graceful-fs": {
+          "version": "4.2.8",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+          "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
+        },
+        "gts": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.0.tgz",
+          "integrity": "sha512-Pbj3ob1VR1IRlEVEBNtKoQ1wHOa8cZz62KEojK8Fn/qeS2ClWI4gLNfhek3lD68aZSmUEg8TFb6AHXIwUMgyqQ==",
+          "requires": {
+            "@typescript-eslint/eslint-plugin": "^4.2.0",
+            "@typescript-eslint/parser": "^4.2.0",
+            "chalk": "^4.1.0",
+            "eslint": "^7.10.0",
+            "eslint-config-prettier": "^7.0.0",
+            "eslint-plugin-node": "^11.1.0",
+            "eslint-plugin-prettier": "^3.1.4",
+            "execa": "^5.0.0",
+            "inquirer": "^7.3.3",
+            "json5": "^2.1.3",
+            "meow": "^9.0.0",
+            "ncp": "^2.0.0",
+            "prettier": "^2.1.2",
+            "rimraf": "^3.0.2",
+            "update-notifier": "^5.0.0",
+            "write-file-atomic": "^3.0.3"
+          }
+        },
+        "hard-rejection": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+          "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA=="
+        },
+        "has": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+          "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+          "requires": {
+            "function-bind": "^1.1.1"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "has-yarn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+          "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
+        },
+        "hosted-git-info": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+          "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "http-cache-semantics": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+          "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+        },
+        "human-signals": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+          "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+        },
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        },
+        "ignore": {
+          "version": "5.1.8",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
+        },
+        "import-fresh": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "import-lazy": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+          "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+        },
+        "imurmurhash": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+          "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+        },
+        "indent-string": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+          "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+          "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+          "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+        },
+        "ini": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+          "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="
+        },
+        "inquirer": {
+          "version": "7.3.3",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+          "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+          "requires": {
+            "ansi-escapes": "^4.2.1",
+            "chalk": "^4.1.0",
+            "cli-cursor": "^3.1.0",
+            "cli-width": "^3.0.0",
+            "external-editor": "^3.0.3",
+            "figures": "^3.0.0",
+            "lodash": "^4.17.19",
+            "mute-stream": "0.0.8",
+            "run-async": "^2.4.0",
+            "rxjs": "^6.6.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0",
+            "through": "^2.3.6"
+          }
+        },
+        "is-arrayish": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+          "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+        },
+        "is-ci": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+          "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+          "requires": {
+            "ci-info": "^2.0.0"
+          }
+        },
+        "is-core-module": {
+          "version": "2.6.0",
+          "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz",
+          "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==",
+          "requires": {
+            "has": "^1.0.3"
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "is-glob": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+          "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+          "requires": {
+            "is-extglob": "^2.1.1"
+          }
+        },
+        "is-installed-globally": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+          "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+          "requires": {
+            "global-dirs": "^3.0.0",
+            "is-path-inside": "^3.0.2"
+          }
+        },
+        "is-npm": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
+          "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+        },
+        "is-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+        },
+        "is-path-inside": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+          "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
+        },
+        "is-plain-obj": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+        },
+        "is-stream": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+          "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+          "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+        },
+        "is-url": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
+          "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+        },
+        "is-yarn-global": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+          "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+        },
+        "isexe": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+          "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+        },
+        "isomorphic-fetch": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+          "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
+          "requires": {
+            "node-fetch": "^1.0.1",
+            "whatwg-fetch": ">=0.10.0"
+          }
+        },
+        "js-base64": {
+          "version": "2.6.4",
+          "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
+          "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
+        },
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+        },
+        "js-yaml": {
+          "version": "3.14.1",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+          "requires": {
+            "argparse": "^1.0.7",
+            "esprima": "^4.0.0"
+          },
+          "dependencies": {
+            "esprima": {
+              "version": "4.0.1",
+              "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+              "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+            }
+          }
+        },
+        "json-buffer": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+          "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+        },
+        "json-parse-even-better-errors": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+          "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "json-stable-stringify-without-jsonify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+          "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+        },
+        "json5": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+          "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "keyv": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+          "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+          "requires": {
+            "json-buffer": "3.0.0"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+        },
+        "latest-version": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+          "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+          "requires": {
+            "package-json": "^6.3.0"
+          }
+        },
+        "levn": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+          "requires": {
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2"
+          }
+        },
+        "lines-and-columns": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+          "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+        },
+        "lodash.clonedeep": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+          "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
+        },
+        "lodash.merge": {
+          "version": "4.6.2",
+          "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+          "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+        },
+        "lodash.truncate": {
+          "version": "4.4.2",
+          "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+          "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM="
+        },
+        "lowercase-keys": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+          "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+        },
+        "lru-cache": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+          "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+          "requires": {
+            "yallist": "^4.0.0"
+          }
+        },
+        "magic-string": {
+          "version": "0.22.5",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+          "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+          "requires": {
+            "vlq": "^0.2.2"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "requires": {
+            "semver": "^6.0.0"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "6.3.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+            }
+          }
+        },
+        "map-obj": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz",
+          "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ=="
+        },
+        "meow": {
+          "version": "9.0.0",
+          "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+          "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+          "requires": {
+            "@types/minimist": "^1.2.0",
+            "camelcase-keys": "^6.2.2",
+            "decamelize": "^1.2.0",
+            "decamelize-keys": "^1.1.0",
+            "hard-rejection": "^2.1.0",
+            "minimist-options": "4.1.0",
+            "normalize-package-data": "^3.0.0",
+            "read-pkg-up": "^7.0.1",
+            "redent": "^3.0.0",
+            "trim-newlines": "^3.0.0",
+            "type-fest": "^0.18.0",
+            "yargs-parser": "^20.2.3"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.18.1",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+              "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw=="
+            }
+          }
+        },
+        "merge-source-map": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
+          "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=",
+          "requires": {
+            "source-map": "^0.5.6"
+          },
+          "dependencies": {
+            "source-map": {
+              "version": "0.5.7",
+              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+            }
+          }
+        },
+        "merge-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+          "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+        },
+        "merge2": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+          "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+        },
+        "micromatch": {
+          "version": "4.0.4",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+          "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.2.3"
+          }
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+        },
+        "mimic-response": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+          "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+        },
+        "min-indent": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+          "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+        },
+        "minimist-options": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+          "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+          "requires": {
+            "arrify": "^1.0.1",
+            "is-plain-obj": "^1.1.0",
+            "kind-of": "^6.0.3"
+          }
+        },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "mute-stream": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+        },
+        "natural-compare": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+          "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+        },
+        "ncp": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
+          "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M="
+        },
+        "node-fetch": {
+          "version": "1.7.3",
+          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+          "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+          "requires": {
+            "encoding": "^0.1.11",
+            "is-stream": "^1.0.1"
+          }
+        },
+        "normalize-package-data": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+          "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+          "requires": {
+            "hosted-git-info": "^4.0.1",
+            "is-core-module": "^2.5.0",
+            "semver": "^7.3.4",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "normalize-url": {
+          "version": "4.5.1",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
+          "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "object-inspect": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
+          "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw=="
+        },
+        "object-keys": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+        },
+        "once": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+          "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "optionator": {
+          "version": "0.8.3",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+          "requires": {
+            "deep-is": "~0.1.3",
+            "fast-levenshtein": "~2.0.6",
+            "levn": "~0.3.0",
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2",
+            "word-wrap": "~1.2.3"
+          }
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+          "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+        },
+        "p-cancelable": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+          "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+        },
+        "p-limit": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+          "requires": {
+            "p-try": "^2.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "p-try": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+        },
+        "package-json": {
+          "version": "6.5.0",
+          "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+          "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+          "requires": {
+            "got": "^9.6.0",
+            "registry-auth-token": "^4.0.0",
+            "registry-url": "^5.0.0",
+            "semver": "^6.2.0"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "6.3.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+            }
+          }
+        },
+        "pako": {
+          "version": "1.0.11",
+          "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+          "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+        },
+        "parent-module": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+          "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+          "requires": {
+            "callsites": "^3.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-even-better-errors": "^2.3.0",
+            "lines-and-columns": "^1.1.6"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+          "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+        },
+        "path-parse": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+          "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+        },
+        "picomatch": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+          "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw=="
+        },
+        "pluralize": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+          "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
+        },
+        "prelude-ls": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+        },
+        "prepend-http": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+        },
+        "prettier": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
+          "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ=="
+        },
+        "prettier-linter-helpers": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+          "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+          "requires": {
+            "fast-diff": "^1.1.2"
+          }
+        },
+        "process-nextick-args": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+          "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+        },
+        "progress": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+          "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+        },
+        "pump": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        },
+        "punycode": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+        },
+        "pupa": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
+          "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+          "requires": {
+            "escape-goat": "^2.0.0"
+          }
+        },
+        "queue-microtask": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+          "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+        },
+        "quick-lru": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+          "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g=="
+        },
+        "quicktype-core": {
+          "version": "6.0.70",
+          "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-6.0.70.tgz",
+          "integrity": "sha512-BMoG1omvauNhgGFzz1AkFVIC0LPXPArE6cCGI5fTeHvXKQsVUCbHt+seee2TaqUkELX9Pk6yA0s8OW8vW3kllA==",
+          "requires": {
+            "@mark.probst/unicode-properties": "~1.1.0",
+            "browser-or-node": "^1.2.1",
+            "collection-utils": "^1.0.1",
+            "is-url": "^1.2.4",
+            "isomorphic-fetch": "^2.2.1",
+            "js-base64": "^2.4.3",
+            "pako": "^1.0.6",
+            "pluralize": "^7.0.0",
+            "readable-stream": "2.3.0",
+            "urijs": "^1.19.1",
+            "wordwrap": "^1.0.0",
+            "yaml": "^1.5.0"
+          }
+        },
+        "quote-stream": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
+          "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=",
+          "requires": {
+            "buffer-equal": "0.0.1",
+            "minimist": "^1.1.3",
+            "through2": "^2.0.0"
+          }
+        },
+        "rc": {
+          "version": "1.2.8",
+          "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+          "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+          "requires": {
+            "deep-extend": "^0.6.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "ini": {
+              "version": "1.3.8",
+              "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+              "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+            },
+            "strip-json-comments": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+              "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+            }
+          }
+        },
+        "read-pkg": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+          "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+          "requires": {
+            "@types/normalize-package-data": "^2.4.0",
+            "normalize-package-data": "^2.5.0",
+            "parse-json": "^5.0.0",
+            "type-fest": "^0.6.0"
+          },
+          "dependencies": {
+            "hosted-git-info": {
+              "version": "2.8.9",
+              "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+              "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+            },
+            "normalize-package-data": {
+              "version": "2.5.0",
+              "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+              "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+              "requires": {
+                "hosted-git-info": "^2.1.4",
+                "resolve": "^1.10.0",
+                "semver": "2 || 3 || 4 || 5",
+                "validate-npm-package-license": "^3.0.1"
+              }
+            },
+            "semver": {
+              "version": "5.7.1",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+            },
+            "type-fest": {
+              "version": "0.6.0",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+              "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+            }
+          }
+        },
+        "read-pkg-up": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+          "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+          "requires": {
+            "find-up": "^4.1.0",
+            "read-pkg": "^5.2.0",
+            "type-fest": "^0.8.1"
+          },
+          "dependencies": {
+            "type-fest": {
+              "version": "0.8.1",
+              "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+              "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.0.tgz",
+          "integrity": "sha512-c7KMXGd4b48nN3OJ1U9qOsn6pXNzf6kLd3kdZCkg2sxAcoiufInqF0XckwEnlrcwuaYwonlNK8GQUIOC/WC7sg==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~1.0.6",
+            "safe-buffer": "~5.1.0",
+            "string_decoder": "~1.0.0",
+            "util-deprecate": "~1.0.1"
+          },
+          "dependencies": {
+            "process-nextick-args": {
+              "version": "1.0.7",
+              "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+              "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
+            },
+            "string_decoder": {
+              "version": "1.0.3",
+              "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+              "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+              "requires": {
+                "safe-buffer": "~5.1.0"
+              }
+            }
+          }
+        },
+        "recursive-readdir": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+          "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+          "requires": {
+            "minimatch": "3.0.4"
+          }
+        },
+        "redent": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+          "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+          "requires": {
+            "indent-string": "^4.0.0",
+            "strip-indent": "^3.0.0"
+          }
+        },
+        "regexpp": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+          "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="
+        },
+        "registry-auth-token": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+          "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+          "requires": {
+            "rc": "^1.2.8"
+          }
+        },
+        "registry-url": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+          "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+          "requires": {
+            "rc": "^1.2.8"
+          }
+        },
+        "require-directory": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+          "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+        },
+        "require-from-string": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+          "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+        },
+        "resolve": {
+          "version": "1.20.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+          "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+          "requires": {
+            "is-core-module": "^2.2.0",
+            "path-parse": "^1.0.6"
+          }
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+        },
+        "responselike": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+          "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+          "requires": {
+            "lowercase-keys": "^1.0.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "requires": {
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "reusify": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+          "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "run-async": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+          "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="
+        },
+        "run-parallel": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+          "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+          "requires": {
+            "queue-microtask": "^1.2.2"
+          }
+        },
+        "rxjs": {
+          "version": "6.6.7",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+          "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+          "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+        },
+        "semver": {
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "semver-diff": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+          "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+          "requires": {
+            "semver": "^6.3.0"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "6.3.0",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+              "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+            }
+          }
+        },
+        "shallow-copy": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
+          "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA="
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+        },
+        "signal-exit": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+          "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+        },
+        "slash": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+        },
+        "slice-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "astral-regex": "^2.0.0",
+            "is-fullwidth-code-point": "^3.0.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "optional": true
+        },
+        "spdx-correct": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+          "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+          "requires": {
+            "spdx-expression-parse": "^3.0.0",
+            "spdx-license-ids": "^3.0.0"
+          }
+        },
+        "spdx-exceptions": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+          "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+        },
+        "spdx-expression-parse": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+          "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+          "requires": {
+            "spdx-exceptions": "^2.1.0",
+            "spdx-license-ids": "^3.0.0"
+          }
+        },
+        "spdx-license-ids": {
+          "version": "3.0.10",
+          "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz",
+          "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA=="
+        },
+        "sprintf-js": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+          "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+        },
+        "static-eval": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
+          "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
+          "requires": {
+            "escodegen": "^1.11.1"
+          },
+          "dependencies": {
+            "escodegen": {
+              "version": "1.14.3",
+              "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+              "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+              "requires": {
+                "esprima": "^4.0.1",
+                "estraverse": "^4.2.0",
+                "esutils": "^2.0.2",
+                "optionator": "^0.8.1",
+                "source-map": "~0.6.1"
+              }
+            },
+            "esprima": {
+              "version": "4.0.1",
+              "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+              "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+            }
+          }
+        },
+        "static-module": {
+          "version": "2.2.5",
+          "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
+          "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==",
+          "requires": {
+            "concat-stream": "~1.6.0",
+            "convert-source-map": "^1.5.1",
+            "duplexer2": "~0.1.4",
+            "escodegen": "~1.9.0",
+            "falafel": "^2.1.0",
+            "has": "^1.0.1",
+            "magic-string": "^0.22.4",
+            "merge-source-map": "1.0.4",
+            "object-inspect": "~1.4.0",
+            "quote-stream": "~1.0.2",
+            "readable-stream": "~2.3.3",
+            "shallow-copy": "~0.0.1",
+            "static-eval": "^2.0.0",
+            "through2": "~2.0.3"
+          },
+          "dependencies": {
+            "readable-stream": {
+              "version": "2.3.7",
+              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+              "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+              "requires": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+              }
+            }
+          }
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "strip-final-newline": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+          "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+        },
+        "strip-indent": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+          "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+          "requires": {
+            "min-indent": "^1.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "table": {
+          "version": "6.7.1",
+          "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
+          "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+          "requires": {
+            "ajv": "^8.0.1",
+            "lodash.clonedeep": "^4.5.0",
+            "lodash.truncate": "^4.4.2",
+            "slice-ansi": "^4.0.0",
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "ajv": {
+              "version": "8.6.2",
+              "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
+              "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
+              "requires": {
+                "fast-deep-equal": "^3.1.1",
+                "json-schema-traverse": "^1.0.0",
+                "require-from-string": "^2.0.2",
+                "uri-js": "^4.2.2"
+              }
+            },
+            "json-schema-traverse": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+              "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+            }
+          }
+        },
+        "text-table": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+          "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+        },
+        "through": {
+          "version": "2.3.8",
+          "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+          "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+        },
+        "through2": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+          "requires": {
+            "readable-stream": "~2.3.6",
+            "xtend": "~4.0.1"
+          },
+          "dependencies": {
+            "readable-stream": {
+              "version": "2.3.7",
+              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+              "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+              "requires": {
+                "core-util-is": "~1.0.0",
+                "inherits": "~2.0.3",
+                "isarray": "~1.0.0",
+                "process-nextick-args": "~2.0.0",
+                "safe-buffer": "~5.1.1",
+                "string_decoder": "~1.1.1",
+                "util-deprecate": "~1.0.1"
+              }
+            }
+          }
+        },
+        "tiny-inflate": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+          "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
+        },
+        "tmp": {
+          "version": "0.0.33",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+          "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+          "requires": {
+            "os-tmpdir": "~1.0.2"
+          }
+        },
+        "to-readable-stream": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+          "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        },
+        "trim-newlines": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+          "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw=="
+        },
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+        },
+        "tsutils": {
+          "version": "3.21.0",
+          "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+          "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+          "requires": {
+            "tslib": "^1.8.1"
+          }
+        },
+        "type-check": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+          "requires": {
+            "prelude-ls": "~1.1.2"
+          }
+        },
+        "type-fest": {
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+          "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+        },
+        "typedarray": {
+          "version": "0.0.6",
+          "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+          "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+        },
+        "typedarray-to-buffer": {
+          "version": "3.1.5",
+          "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+          "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+          "requires": {
+            "is-typedarray": "^1.0.0"
+          }
+        },
+        "typescript": {
+          "version": "4.5.4",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
+          "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg=="
+        },
+        "unicode-trie": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz",
+          "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=",
+          "requires": {
+            "pako": "^0.2.5",
+            "tiny-inflate": "^1.0.0"
+          },
+          "dependencies": {
+            "pako": {
+              "version": "0.2.9",
+              "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+              "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU="
+            }
+          }
+        },
+        "unique-string": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+          "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+          "requires": {
+            "crypto-random-string": "^2.0.0"
+          }
+        },
+        "update-notifier": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
+          "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
+          "requires": {
+            "boxen": "^5.0.0",
+            "chalk": "^4.1.0",
+            "configstore": "^5.0.1",
+            "has-yarn": "^2.1.0",
+            "import-lazy": "^2.1.0",
+            "is-ci": "^2.0.0",
+            "is-installed-globally": "^0.4.0",
+            "is-npm": "^5.0.0",
+            "is-yarn-global": "^0.3.0",
+            "latest-version": "^5.1.0",
+            "pupa": "^2.1.1",
+            "semver": "^7.3.4",
+            "semver-diff": "^3.1.1",
+            "xdg-basedir": "^4.0.0"
+          }
+        },
+        "uri-js": {
+          "version": "4.4.1",
+          "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+          "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+          "requires": {
+            "punycode": "^2.1.0"
+          }
+        },
+        "urijs": {
+          "version": "1.19.7",
+          "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.7.tgz",
+          "integrity": "sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA=="
+        },
+        "url-parse-lax": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+          "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+          "requires": {
+            "prepend-http": "^2.0.0"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+          "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+        },
+        "v8-compile-cache": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+          "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
+        },
+        "validate-npm-package-license": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+          "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+          "requires": {
+            "spdx-correct": "^3.0.0",
+            "spdx-expression-parse": "^3.0.0"
+          }
+        },
+        "vlq": {
+          "version": "0.2.3",
+          "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+          "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow=="
+        },
+        "whatwg-fetch": {
+          "version": "3.6.2",
+          "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
+          "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA=="
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        },
+        "widest-line": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+          "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+          "requires": {
+            "string-width": "^4.0.0"
+          }
+        },
+        "word-wrap": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+          "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+        },
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+        },
+        "wrap-ansi": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+          "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+          "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+        },
+        "write-file-atomic": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+          "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+          "requires": {
+            "imurmurhash": "^0.1.4",
+            "is-typedarray": "^1.0.0",
+            "signal-exit": "^3.0.2",
+            "typedarray-to-buffer": "^3.1.5"
+          }
+        },
+        "xdg-basedir": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+          "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
+        },
+        "xtend": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+          "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+        },
+        "y18n": {
+          "version": "5.0.8",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+          "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
+        },
+        "yallist": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+          "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+        },
+        "yaml": {
+          "version": "1.10.2",
+          "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+          "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+        },
+        "yargs": {
+          "version": "17.1.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
+          "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
+          "requires": {
+            "cliui": "^7.0.2",
+            "escalade": "^3.1.1",
+            "get-caller-file": "^2.0.5",
+            "require-directory": "^2.1.1",
+            "string-width": "^4.2.0",
+            "y18n": "^5.0.5",
+            "yargs-parser": "^20.2.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "20.2.9",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
+        }
+      }
+    },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
+    },
+    "quick-lru": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+      "dev": true
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dev": true,
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "dependencies": {
+        "ini": {
+          "version": "1.3.8",
+          "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+          "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+          "dev": true
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+      "dev": true,
+      "requires": {
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
+      },
+      "dependencies": {
+        "hosted-git-info": {
+          "version": "2.8.9",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+          "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+          "dev": true
+        },
+        "normalize-package-data": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.1.4",
+            "resolve": "^1.10.0",
+            "semver": "2 || 3 || 4 || 5",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+      "dev": true,
+      "requires": {
+        "find-up": "^4.1.0",
+        "read-pkg": "^5.2.0",
+        "type-fest": "^0.8.1"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
+        }
+      }
+    },
+    "redent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+      "dev": true,
+      "requires": {
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
+      }
+    },
+    "regexpp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+      "dev": true
+    },
+    "registry-auth-token": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+      "dev": true,
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "registry-url": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+      "dev": true,
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "responselike": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "dev": true,
+      "requires": {
+        "lowercase-keys": "^1.0.0"
+      }
+    },
+    "restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
+      "requires": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
+    },
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "rxjs": {
+      "version": "6.6.7",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "semver": {
+      "version": "7.3.5",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "semver-diff": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+      "dev": true,
+      "requires": {
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
+      "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
+      "dev": true
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      }
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.11",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
+      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+      "dev": true
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "squirrelly": {
+      "version": "8.0.8",
+      "resolved": "https://registry.npmjs.org/squirrelly/-/squirrelly-8.0.8.tgz",
+      "integrity": "sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w=="
+    },
+    "string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+      "dev": true,
+      "requires": {
+        "min-indent": "^1.0.0"
+      }
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "table": {
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+      "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
+      "dev": true,
+      "requires": {
+        "ajv": "^8.0.1",
+        "lodash.truncate": "^4.4.2",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "8.9.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+          "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "json-schema-traverse": "^1.0.0",
+            "require-from-string": "^2.0.2",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "json-schema-traverse": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+          "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+          "dev": true
+        }
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "to-readable-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+      "dev": true
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "trim-newlines": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+      "dev": true
+    },
+    "tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "dev": true
+    },
+    "tsutils": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      }
+    },
+    "type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1"
+      }
+    },
+    "type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "dev": true,
+      "requires": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "typescript": {
+      "version": "4.5.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
+      "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
+      "dev": true
+    },
+    "unique-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "dev": true,
+      "requires": {
+        "crypto-random-string": "^2.0.0"
+      }
+    },
+    "update-notifier": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
+      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
+      "dev": true,
+      "requires": {
+        "boxen": "^5.0.0",
+        "chalk": "^4.1.0",
+        "configstore": "^5.0.1",
+        "has-yarn": "^2.1.0",
+        "import-lazy": "^2.1.0",
+        "is-ci": "^2.0.0",
+        "is-installed-globally": "^0.4.0",
+        "is-npm": "^5.0.0",
+        "is-yarn-global": "^0.3.0",
+        "latest-version": "^5.1.0",
+        "pupa": "^2.1.1",
+        "semver": "^7.3.4",
+        "semver-diff": "^3.1.1",
+        "xdg-basedir": "^4.0.0"
+      }
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "url-parse-lax": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "dev": true,
+      "requires": {
+        "prepend-http": "^2.0.0"
+      }
+    },
+    "v8-compile-cache": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "dev": true
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "widest-line": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+      "dev": true,
+      "requires": {
+        "string-width": "^4.0.0"
+      }
+    },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
+    },
+    "wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "xdg-basedir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+      "dev": true
+    },
+    "y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
+    },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "yargs": {
+      "version": "17.3.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
+      "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==",
+      "requires": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.0.0"
+      }
+    },
+    "yargs-parser": {
+      "version": "21.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz",
+      "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA=="
+    }
+  }
+}
diff --git a/gen/src/index.ts b/gen/src/index.ts
index 8b7ebb7..5365ec7 100644
--- a/gen/src/index.ts
+++ b/gen/src/index.ts
@@ -84,7 +84,8 @@ async function main() {
     }
 
     // Collect event related information
-    const eventDescription = schema.description.replace(/\n/g, '');
+    const definitions = schema.definitions
+    const eventDescription = definitions[eventName]["description"].replace(/\n/g, '');
     const event = {
       package: pkg,
       eventName: eventName,
diff --git a/setup.py b/setup.py
index 0b065d1..406b72b 100644
--- a/setup.py
+++ b/setup.py
@@ -10,7 +10,7 @@
 
 setup(
     name="google-events",
-    version = "0.2.0",
+    version="0.2.1",
     description="A collection of first party Google Cloud Platform event objects.",
     long_description=readme,
     long_description_content_type="text/markdown",
@@ -29,16 +29,13 @@
         "License :: OSI Approved :: Apache Software License",
         "Operating System :: OS Independent",
         "Topic :: Internet",
-        "Programming Language :: Python",
         "Programming Language :: Python :: 3",
         "Programming Language :: Python :: 3.7",
         "Programming Language :: Python :: 3.8",
-        "Programming Language :: Python :: 3.9",
-        "Programming Language :: Python :: 3.10",
     ],
     packages=find_packages("src"),
     package_dir={"": "src"},
     python_requires=">=3.7",
-    install_requires=['python-dateutil==2.8.2'],
+    install_requires=['python-dateutil==2.8.1'],
     extras_require={"dev": ["pylint", "pytest", "black", "stringcase"]}
 )
diff --git a/src/google/events/cloud/audit/v1/LogEntryData.py b/src/google/events/cloud/audit/v1/LogEntryData.py
index 41e4fb6..d431710 100644
--- a/src/google/events/cloud/audit/v1/LogEntryData.py
+++ b/src/google/events/cloud/audit/v1/LogEntryData.py
@@ -11,76 +11,18 @@
 # 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 code parses date/times, so please
-#
-#     pip install python-dateutil
-#
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = log_entry_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Any, Dict, List, Union, TypeVar, Callable, Type, cast
+from typing import Optional, Dict, Any, List, Union
 from datetime import datetime
-import dateutil.parser
-
-
-T = TypeVar("T")
-
-
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
-    return x
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
-
-
-def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
-    assert isinstance(x, list)
-    return [f(y) for y in x]
-
-
-def from_datetime(x: Any) -> datetime:
-    return dateutil.parser.parse(x)
-
-
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
+from enum import Enum
 
 
 class Operation:
-    """Information about an operation associated with the log entry, if applicable."""
+    """Information about an operation associated with the log entry, if
+    applicable.
+    
+    Additional information about a potentially long-running operation with which
+    a log entry is associated.
+    """
     """True if this is the first log entry in the operation."""
     first: Optional[bool]
     """An arbitrary operation identifier. Log entries with the same
@@ -101,160 +43,51 @@ def __init__(self, first: Optional[bool], id: Optional[str], last: Optional[bool
         self.last = last
         self.producer = producer
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Operation':
-        assert isinstance(obj, dict)
-        first = from_union([from_bool, from_none], obj.get("first"))
-        id = from_union([from_str, from_none], obj.get("id"))
-        last = from_union([from_bool, from_none], obj.get("last"))
-        producer = from_union([from_str, from_none], obj.get("producer"))
-        return Operation(first, id, last, producer)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["first"] = from_union([from_bool, from_none], self.first)
-        result["id"] = from_union([from_str, from_none], self.id)
-        result["last"] = from_union([from_bool, from_none], self.last)
-        result["producer"] = from_union([from_str, from_none], self.producer)
-        return result
-
-
-class ServiceMetadata:
-    """Metadata about the service that uses the service account."""
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'ServiceMetadata':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return ServiceMetadata(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
 
 class FirstPartyPrincipal:
-    """First party (Google) identity as the real authority."""
+    """First party (Google) identity as the real authority.
+    
+    First party identity principal.
+    """
     """The email address of a Google account."""
     principal_email: Optional[str]
     """Metadata about the service that uses the service account."""
-    service_metadata: Optional[ServiceMetadata]
+    service_metadata: Optional[Dict[str, Any]]
 
-    def __init__(self, principal_email: Optional[str], service_metadata: Optional[ServiceMetadata]) -> None:
+    def __init__(self, principal_email: Optional[str], service_metadata: Optional[Dict[str, Any]]) -> None:
         self.principal_email = principal_email
         self.service_metadata = service_metadata
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'FirstPartyPrincipal':
-        assert isinstance(obj, dict)
-        principal_email = from_union([from_str, from_none], obj.get("principalEmail"))
-        service_metadata = from_union([ServiceMetadata.from_dict, from_none], obj.get("serviceMetadata"))
-        return FirstPartyPrincipal(principal_email, service_metadata)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["principalEmail"] = from_union([from_str, from_none], self.principal_email)
-        result["serviceMetadata"] = from_union([lambda x: to_class(ServiceMetadata, x), from_none], self.service_metadata)
-        return result
-
-
-class ThirdPartyClaims:
-    """Metadata about third party identity."""
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'ThirdPartyClaims':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return ThirdPartyClaims(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
 
-
-class ServiceAccountDelegationInfoThirdPartyPrincipal:
-    """Third party identity as the real authority."""
+class ThirdPartyPrincipal:
+    """Third party identity as the real authority.
+    
+    Third party identity principal.
+    """
     """Metadata about third party identity."""
-    third_party_claims: Optional[ThirdPartyClaims]
+    third_party_claims: Optional[Dict[str, Any]]
 
-    def __init__(self, third_party_claims: Optional[ThirdPartyClaims]) -> None:
+    def __init__(self, third_party_claims: Optional[Dict[str, Any]]) -> None:
         self.third_party_claims = third_party_claims
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ServiceAccountDelegationInfoThirdPartyPrincipal':
-        assert isinstance(obj, dict)
-        third_party_claims = from_union([ThirdPartyClaims.from_dict, from_none], obj.get("thirdPartyClaims"))
-        return ServiceAccountDelegationInfoThirdPartyPrincipal(third_party_claims)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["thirdPartyClaims"] = from_union([lambda x: to_class(ThirdPartyClaims, x), from_none], self.third_party_claims)
-        return result
-
 
 class ServiceAccountDelegationInfo:
     """Identity delegation history of an authenticated service account."""
     """First party (Google) identity as the real authority."""
     first_party_principal: Optional[FirstPartyPrincipal]
     """Third party identity as the real authority."""
-    third_party_principal: Optional[ServiceAccountDelegationInfoThirdPartyPrincipal]
+    third_party_principal: Optional[ThirdPartyPrincipal]
 
-    def __init__(self, first_party_principal: Optional[FirstPartyPrincipal], third_party_principal: Optional[ServiceAccountDelegationInfoThirdPartyPrincipal]) -> None:
+    def __init__(self, first_party_principal: Optional[FirstPartyPrincipal], third_party_principal: Optional[ThirdPartyPrincipal]) -> None:
         self.first_party_principal = first_party_principal
         self.third_party_principal = third_party_principal
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ServiceAccountDelegationInfo':
-        assert isinstance(obj, dict)
-        first_party_principal = from_union([FirstPartyPrincipal.from_dict, from_none], obj.get("firstPartyPrincipal"))
-        third_party_principal = from_union([ServiceAccountDelegationInfoThirdPartyPrincipal.from_dict, from_none], obj.get("thirdPartyPrincipal"))
-        return ServiceAccountDelegationInfo(first_party_principal, third_party_principal)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["firstPartyPrincipal"] = from_union([lambda x: to_class(FirstPartyPrincipal, x), from_none], self.first_party_principal)
-        result["thirdPartyPrincipal"] = from_union([lambda x: to_class(ServiceAccountDelegationInfoThirdPartyPrincipal, x), from_none], self.third_party_principal)
-        return result
-
-
-class AuthenticationInfoThirdPartyPrincipal:
-    """The third party identification (if any) of the authenticated user making
-    the request.
-    When the JSON object represented here has a proto equivalent, the proto
-    name will be indicated in the `@type` property.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'AuthenticationInfoThirdPartyPrincipal':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return AuthenticationInfoThirdPartyPrincipal(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
 
 class AuthenticationInfo:
-    """Authentication information."""
+    """Authentication information.
+    
+    Authentication information for the operation.
+    """
     """The authority selector specified by the requestor, if any.
     It is not guaranteed that the principal was allowed to use this authority.
     """
@@ -288,9 +121,9 @@ class AuthenticationInfo:
     When the JSON object represented here has a proto equivalent, the proto
     name will be indicated in the `@type` property.
     """
-    third_party_principal: Optional[AuthenticationInfoThirdPartyPrincipal]
+    third_party_principal: Optional[Dict[str, Any]]
 
-    def __init__(self, authority_selector: Optional[str], principal_email: Optional[str], principal_subject: Optional[str], service_account_delegation_info: Optional[List[ServiceAccountDelegationInfo]], service_account_key_name: Optional[str], third_party_principal: Optional[AuthenticationInfoThirdPartyPrincipal]) -> None:
+    def __init__(self, authority_selector: Optional[str], principal_email: Optional[str], principal_subject: Optional[str], service_account_delegation_info: Optional[List[ServiceAccountDelegationInfo]], service_account_key_name: Optional[str], third_party_principal: Optional[Dict[str, Any]]) -> None:
         self.authority_selector = authority_selector
         self.principal_email = principal_email
         self.principal_subject = principal_subject
@@ -298,35 +131,18 @@ def __init__(self, authority_selector: Optional[str], principal_email: Optional[
         self.service_account_key_name = service_account_key_name
         self.third_party_principal = third_party_principal
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'AuthenticationInfo':
-        assert isinstance(obj, dict)
-        authority_selector = from_union([from_str, from_none], obj.get("authoritySelector"))
-        principal_email = from_union([from_str, from_none], obj.get("principalEmail"))
-        principal_subject = from_union([from_str, from_none], obj.get("principalSubject"))
-        service_account_delegation_info = from_union([lambda x: from_list(ServiceAccountDelegationInfo.from_dict, x), from_none], obj.get("serviceAccountDelegationInfo"))
-        service_account_key_name = from_union([from_str, from_none], obj.get("serviceAccountKeyName"))
-        third_party_principal = from_union([AuthenticationInfoThirdPartyPrincipal.from_dict, from_none], obj.get("thirdPartyPrincipal"))
-        return AuthenticationInfo(authority_selector, principal_email, principal_subject, service_account_delegation_info, service_account_key_name, third_party_principal)
 
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["authoritySelector"] = from_union([from_str, from_none], self.authority_selector)
-        result["principalEmail"] = from_union([from_str, from_none], self.principal_email)
-        result["principalSubject"] = from_union([from_str, from_none], self.principal_subject)
-        result["serviceAccountDelegationInfo"] = from_union([lambda x: from_list(lambda x: to_class(ServiceAccountDelegationInfo, x), x), from_none], self.service_account_delegation_info)
-        result["serviceAccountKeyName"] = from_union([from_str, from_none], self.service_account_key_name)
-        result["thirdPartyPrincipal"] = from_union([lambda x: to_class(AuthenticationInfoThirdPartyPrincipal, x), from_none], self.third_party_principal)
-        return result
-
-
-class ResourceAttributes:
+class ResourceAttributesClass:
     """Resource attributes used in IAM condition evaluation. This field contains
     resource attributes like resource type and resource name.
     
     To get the whole view of the attributes used in IAM
     condition evaluation, the user must also look into
     `AuditLogData.request_metadata.request_attributes`.
+    
+    This message defines core attributes for a resource. A resource is an
+    addressable (named) entity provided by the destination service. For
+    example, a file stored on a network storage service.
     """
     """The labels or tags on the resource, such as AWS resource tags and
     Kubernetes resource labels.
@@ -364,23 +180,6 @@ def __init__(self, labels: Optional[Dict[str, str]], name: Optional[str], servic
         self.service = service
         self.type = type
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ResourceAttributes':
-        assert isinstance(obj, dict)
-        labels = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("labels"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        service = from_union([from_str, from_none], obj.get("service"))
-        type = from_union([from_str, from_none], obj.get("type"))
-        return ResourceAttributes(labels, name, service, type)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["labels"] = from_union([lambda x: from_dict(from_str, x), from_none], self.labels)
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["service"] = from_union([from_str, from_none], self.service)
-        result["type"] = from_union([from_str, from_none], self.type)
-        return result
-
 
 class AuthorizationInfo:
     """Authorization information for the operation."""
@@ -402,79 +201,14 @@ class AuthorizationInfo:
     condition evaluation, the user must also look into
     `AuditLogData.request_metadata.request_attributes`.
     """
-    resource_attributes: Optional[ResourceAttributes]
+    resource_attributes: Optional[ResourceAttributesClass]
 
-    def __init__(self, granted: Optional[bool], permission: Optional[str], resource: Optional[str], resource_attributes: Optional[ResourceAttributes]) -> None:
+    def __init__(self, granted: Optional[bool], permission: Optional[str], resource: Optional[str], resource_attributes: Optional[ResourceAttributesClass]) -> None:
         self.granted = granted
         self.permission = permission
         self.resource = resource
         self.resource_attributes = resource_attributes
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'AuthorizationInfo':
-        assert isinstance(obj, dict)
-        granted = from_union([from_bool, from_none], obj.get("granted"))
-        permission = from_union([from_str, from_none], obj.get("permission"))
-        resource = from_union([from_str, from_none], obj.get("resource"))
-        resource_attributes = from_union([ResourceAttributes.from_dict, from_none], obj.get("resourceAttributes"))
-        return AuthorizationInfo(granted, permission, resource, resource_attributes)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["granted"] = from_union([from_bool, from_none], self.granted)
-        result["permission"] = from_union([from_str, from_none], self.permission)
-        result["resource"] = from_union([from_str, from_none], self.resource)
-        result["resourceAttributes"] = from_union([lambda x: to_class(ResourceAttributes, x), from_none], self.resource_attributes)
-        return result
-
-
-class Metadata:
-    """Other service-specific data about the request, response, and other
-    information associated with the current audited event.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Metadata':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return Metadata(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
-
-class Request:
-    """The operation request. This may not include all request parameters,
-    such as those that are too large, privacy-sensitive, or duplicated
-    elsewhere in the log record.
-    It should never include user-generated data, such as file contents.
-    When the JSON object represented here has a proto equivalent, the proto
-    name will be indicated in the `@type` property.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Request':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return Request(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
 
 class DestinationAttributes:
     """The destination of a network activity, such as accepting a TCP connection.
@@ -482,13 +216,18 @@ class DestinationAttributes:
     the last hop. Only two fields are used in this message, Peer.port and
     Peer.ip. These fields are optionally populated by those services utilizing
     the IAM condition feature.
+    
+    This message defines attributes for a node that handles a network request.
+    The node can be either a service or an application that sends, forwards,
+    or receives the request. Service peers should fill in
+    `principal` and `labels` as appropriate.
     """
     """The IP address of the peer."""
     ip: Optional[str]
     """The labels associated with the peer."""
     labels: Optional[Dict[str, str]]
     """The network port of the peer."""
-    port: Optional[str]
+    port: Optional[int]
     """The identity of this peer. Similar to `Request.auth.principal`, but
     relative to the peer instead of the request. For example, the
     idenity associated with a load balancer that forwared the request.
@@ -500,71 +239,21 @@ class DestinationAttributes:
     """
     region_code: Optional[str]
 
-    def __init__(self, ip: Optional[str], labels: Optional[Dict[str, str]], port: Optional[str], principal: Optional[str], region_code: Optional[str]) -> None:
+    def __init__(self, ip: Optional[str], labels: Optional[Dict[str, str]], port: Optional[int], principal: Optional[str], region_code: Optional[str]) -> None:
         self.ip = ip
         self.labels = labels
         self.port = port
         self.principal = principal
         self.region_code = region_code
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'DestinationAttributes':
-        assert isinstance(obj, dict)
-        ip = from_union([from_str, from_none], obj.get("ip"))
-        labels = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("labels"))
-        port = from_union([from_str, from_none], obj.get("port"))
-        principal = from_union([from_str, from_none], obj.get("principal"))
-        region_code = from_union([from_str, from_none], obj.get("regionCode"))
-        return DestinationAttributes(ip, labels, port, principal, region_code)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["ip"] = from_union([from_str, from_none], self.ip)
-        result["labels"] = from_union([lambda x: from_dict(from_str, x), from_none], self.labels)
-        result["port"] = from_union([from_str, from_none], self.port)
-        result["principal"] = from_union([from_str, from_none], self.principal)
-        result["regionCode"] = from_union([from_str, from_none], self.region_code)
-        return result
-
-
-class Claims:
-    """Structured claims presented with the credential. JWTs include
-    `{key: value}` pairs for standard and private claims. The following
-    is a subset of the standard required and optional claims that would
-    typically be presented for a Google-based JWT:
-    
-    {'iss': 'accounts.google.com',
-    'sub': '113289723416554971153',
-    'aud': ['123456789012', 'pubsub.googleapis.com'],
-    'azp': '123456789012.apps.googleusercontent.com',
-    'email': 'jsmith@example.com',
-    'iat': 1353601026,
-    'exp': 1353604926}
-    
-    SAML assertions are similarly specified, but with an identity provider
-    dependent structure.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Claims':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return Claims(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
 
 class Auth:
     """The request authentication. May be absent for unauthenticated requests.
     Derived from the HTTP request `Authorization` header or equivalent.
+    
+    This message defines request authentication attributes. Terminology is
+    based on the JSON Web Token (JWT) standard, but the terms also
+    correlate to concepts in other standards.
     """
     """A list of access level resource names that allow resources to be
     accessed by authenticated requester. It is part of Secure GCP processing
@@ -607,7 +296,7 @@ class Auth:
     SAML assertions are similarly specified, but with an identity provider
     dependent structure.
     """
-    claims: Optional[Claims]
+    claims: Optional[Dict[str, Any]]
     """The authorized presenter of the credential. Reflects the optional
     Authorized Presenter (`azp`) claim within a JWT or the
     OAuth client id. For example, a Google Cloud Platform client id looks
@@ -622,34 +311,15 @@ class Auth:
     """
     principal: Optional[str]
 
-    def __init__(self, access_levels: Optional[List[str]], audiences: Optional[List[str]], claims: Optional[Claims], presenter: Optional[str], principal: Optional[str]) -> None:
+    def __init__(self, access_levels: Optional[List[str]], audiences: Optional[List[str]], claims: Optional[Dict[str, Any]], presenter: Optional[str], principal: Optional[str]) -> None:
         self.access_levels = access_levels
         self.audiences = audiences
         self.claims = claims
         self.presenter = presenter
         self.principal = principal
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Auth':
-        assert isinstance(obj, dict)
-        access_levels = from_union([lambda x: from_list(from_str, x), from_none], obj.get("accessLevels"))
-        audiences = from_union([lambda x: from_list(from_str, x), from_none], obj.get("audiences"))
-        claims = from_union([Claims.from_dict, from_none], obj.get("claims"))
-        presenter = from_union([from_str, from_none], obj.get("presenter"))
-        principal = from_union([from_str, from_none], obj.get("principal"))
-        return Auth(access_levels, audiences, claims, presenter, principal)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["accessLevels"] = from_union([lambda x: from_list(from_str, x), from_none], self.access_levels)
-        result["audiences"] = from_union([lambda x: from_list(from_str, x), from_none], self.audiences)
-        result["claims"] = from_union([lambda x: to_class(Claims, x), from_none], self.claims)
-        result["presenter"] = from_union([from_str, from_none], self.presenter)
-        result["principal"] = from_union([from_str, from_none], self.principal)
-        return result
 
-
-class RequestAttributes:
+class Request:
     """Request attributes used in IAM condition evaluation. This field contains
     request attributes like request time and access levels associated with
     the request.
@@ -658,6 +328,10 @@ class RequestAttributes:
     To get the whole view of the attributes used in IAM
     condition evaluation, the user must also look into
     `AuditLog.authentication_info.resource_attributes`.
+    
+    This message defines attributes for an HTTP request. If the actual
+    request is not an HTTP request, the runtime system should try to map
+    the actual request to an equivalent HTTP request.
     """
     """The request authentication. May be absent for unauthenticated requests.
     Derived from the HTTP request `Authorization` header or equivalent.
@@ -697,13 +371,13 @@ class RequestAttributes:
     """The HTTP URL scheme, such as `http` and `https`."""
     scheme: Optional[str]
     """The HTTP request size in bytes. If unknown, it must be -1."""
-    size: Optional[str]
+    size: Optional[int]
     """The timestamp when the `destination` service receives the first byte of
     the request.
     """
     time: Optional[datetime]
 
-    def __init__(self, auth: Optional[Auth], headers: Optional[Dict[str, str]], host: Optional[str], id: Optional[str], method: Optional[str], path: Optional[str], protocol: Optional[str], query: Optional[str], reason: Optional[str], scheme: Optional[str], size: Optional[str], time: Optional[datetime]) -> None:
+    def __init__(self, auth: Optional[Auth], headers: Optional[Dict[str, str]], host: Optional[str], id: Optional[str], method: Optional[str], path: Optional[str], protocol: Optional[str], query: Optional[str], reason: Optional[str], scheme: Optional[str], size: Optional[int], time: Optional[datetime]) -> None:
         self.auth = auth
         self.headers = headers
         self.host = host
@@ -717,42 +391,12 @@ def __init__(self, auth: Optional[Auth], headers: Optional[Dict[str, str]], host
         self.size = size
         self.time = time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'RequestAttributes':
-        assert isinstance(obj, dict)
-        auth = from_union([Auth.from_dict, from_none], obj.get("auth"))
-        headers = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("headers"))
-        host = from_union([from_str, from_none], obj.get("host"))
-        id = from_union([from_str, from_none], obj.get("id"))
-        method = from_union([from_str, from_none], obj.get("method"))
-        path = from_union([from_str, from_none], obj.get("path"))
-        protocol = from_union([from_str, from_none], obj.get("protocol"))
-        query = from_union([from_str, from_none], obj.get("query"))
-        reason = from_union([from_str, from_none], obj.get("reason"))
-        scheme = from_union([from_str, from_none], obj.get("scheme"))
-        size = from_union([from_str, from_none], obj.get("size"))
-        time = from_union([from_datetime, from_none], obj.get("time"))
-        return RequestAttributes(auth, headers, host, id, method, path, protocol, query, reason, scheme, size, time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["auth"] = from_union([lambda x: to_class(Auth, x), from_none], self.auth)
-        result["headers"] = from_union([lambda x: from_dict(from_str, x), from_none], self.headers)
-        result["host"] = from_union([from_str, from_none], self.host)
-        result["id"] = from_union([from_str, from_none], self.id)
-        result["method"] = from_union([from_str, from_none], self.method)
-        result["path"] = from_union([from_str, from_none], self.path)
-        result["protocol"] = from_union([from_str, from_none], self.protocol)
-        result["query"] = from_union([from_str, from_none], self.query)
-        result["reason"] = from_union([from_str, from_none], self.reason)
-        result["scheme"] = from_union([from_str, from_none], self.scheme)
-        result["size"] = from_union([from_str, from_none], self.size)
-        result["time"] = from_union([lambda x: x.isoformat(), from_none], self.time)
-        return result
-
 
 class RequestMetadata:
-    """Metadata about the operation."""
+    """Metadata about the operation.
+    
+    Metadata about the request.
+    """
     """The IP address of the caller.
     For caller from internet, this will be public IPv4 or IPv6 address.
     For caller from a Compute Engine VM with external IP address, this
@@ -802,37 +446,21 @@ class RequestMetadata:
     condition evaluation, the user must also look into
     `AuditLog.authentication_info.resource_attributes`.
     """
-    request_attributes: Optional[RequestAttributes]
+    request_attributes: Optional[Request]
 
-    def __init__(self, caller_ip: Optional[str], caller_network: Optional[str], caller_supplied_user_agent: Optional[str], destination_attributes: Optional[DestinationAttributes], request_attributes: Optional[RequestAttributes]) -> None:
+    def __init__(self, caller_ip: Optional[str], caller_network: Optional[str], caller_supplied_user_agent: Optional[str], destination_attributes: Optional[DestinationAttributes], request_attributes: Optional[Request]) -> None:
         self.caller_ip = caller_ip
         self.caller_network = caller_network
         self.caller_supplied_user_agent = caller_supplied_user_agent
         self.destination_attributes = destination_attributes
         self.request_attributes = request_attributes
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'RequestMetadata':
-        assert isinstance(obj, dict)
-        caller_ip = from_union([from_str, from_none], obj.get("callerIp"))
-        caller_network = from_union([from_str, from_none], obj.get("callerNetwork"))
-        caller_supplied_user_agent = from_union([from_str, from_none], obj.get("callerSuppliedUserAgent"))
-        destination_attributes = from_union([DestinationAttributes.from_dict, from_none], obj.get("destinationAttributes"))
-        request_attributes = from_union([RequestAttributes.from_dict, from_none], obj.get("requestAttributes"))
-        return RequestMetadata(caller_ip, caller_network, caller_supplied_user_agent, destination_attributes, request_attributes)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["callerIp"] = from_union([from_str, from_none], self.caller_ip)
-        result["callerNetwork"] = from_union([from_str, from_none], self.caller_network)
-        result["callerSuppliedUserAgent"] = from_union([from_str, from_none], self.caller_supplied_user_agent)
-        result["destinationAttributes"] = from_union([lambda x: to_class(DestinationAttributes, x), from_none], self.destination_attributes)
-        result["requestAttributes"] = from_union([lambda x: to_class(RequestAttributes, x), from_none], self.request_attributes)
-        return result
-
 
 class ResourceLocation:
-    """The resource location information."""
+    """The resource location information.
+    
+    Location information about a resource.
+    """
     """The locations of a resource after the execution of the operation.
     Requests to create or delete a location based resource must populate
     the 'current_locations' field and not the 'original_locations' field.
@@ -858,97 +486,6 @@ def __init__(self, current_locations: Optional[List[str]], original_locations: O
         self.current_locations = current_locations
         self.original_locations = original_locations
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ResourceLocation':
-        assert isinstance(obj, dict)
-        current_locations = from_union([lambda x: from_list(from_str, x), from_none], obj.get("currentLocations"))
-        original_locations = from_union([lambda x: from_list(from_str, x), from_none], obj.get("originalLocations"))
-        return ResourceLocation(current_locations, original_locations)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["currentLocations"] = from_union([lambda x: from_list(from_str, x), from_none], self.current_locations)
-        result["originalLocations"] = from_union([lambda x: from_list(from_str, x), from_none], self.original_locations)
-        return result
-
-
-class ResourceOriginalState:
-    """The resource's original state before mutation. Present only for
-    operations which have successfully modified the targeted resource(s).
-    In general, this field should contain all changed fields, except those
-    that are already been included in `request`, `response`, `metadata` or
-    `service_data` fields.
-    When the JSON object represented here has a proto equivalent,
-    the proto name will be indicated in the `@type` property.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'ResourceOriginalState':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return ResourceOriginalState(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
-
-class Response:
-    """The operation response. This may not include all response elements,
-    such as those that are too large, privacy-sensitive, or duplicated
-    elsewhere in the log record.
-    It should never include user-generated data, such as file contents.
-    When the JSON object represented here has a proto equivalent, the proto
-    name will be indicated in the `@type` property.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Response':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return Response(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
-
-class ServiceData:
-    """Deprecated, use `metadata` field instead.
-    Other service-specific data about the request, response, and other
-    activities.
-    When the JSON object represented here has a proto equivalent, the proto
-    name will be indicated in the `@type` property.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'ServiceData':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return ServiceData(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
-
 
 class Detail:
     """`Any` contains an arbitrary serialized protocol buffer message along with a
@@ -1067,22 +604,18 @@ def __init__(self, type_url: Optional[str], value: Optional[str]) -> None:
         self.type_url = type_url
         self.value = value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Detail':
-        assert isinstance(obj, dict)
-        type_url = from_union([from_str, from_none], obj.get("typeUrl"))
-        value = from_union([from_str, from_none], obj.get("value"))
-        return Detail(type_url, value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["typeUrl"] = from_union([from_str, from_none], self.type_url)
-        result["value"] = from_union([from_str, from_none], self.value)
-        return result
-
 
 class Status:
-    """The status of the overall operation."""
+    """The status of the overall operation.
+    
+    The `Status` type defines a logical error model that is suitable for
+    different programming environments, including REST APIs and RPC APIs. It is
+    used by [gRPC](https://github.com/grpc). Each `Status` message contains
+    three pieces of data: error code, error message, and error details.
+    
+    You can find out more about this error model and how to work with it in the
+    [API Design Guide](https://cloud.google.com/apis/design/errors).
+    """
     """The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code]."""
     code: Optional[int]
     """A list of messages that carry the error details.  There is a common set of
@@ -1100,24 +633,16 @@ def __init__(self, code: Optional[int], details: Optional[List[Detail]], message
         self.details = details
         self.message = message
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Status':
-        assert isinstance(obj, dict)
-        code = from_union([from_int, from_none], obj.get("code"))
-        details = from_union([lambda x: from_list(Detail.from_dict, x), from_none], obj.get("details"))
-        message = from_union([from_str, from_none], obj.get("message"))
-        return Status(code, details, message)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["code"] = from_union([from_int, from_none], self.code)
-        result["details"] = from_union([lambda x: from_list(lambda x: to_class(Detail, x), x), from_none], self.details)
-        result["message"] = from_union([from_str, from_none], self.message)
-        return result
-
 
 class ProtoPayload:
-    """The log entry payload, which is always an AuditLog for Cloud Audit Log events."""
+    """The log entry payload, which is always an AuditLog for Cloud Audit Log
+    events.
+    
+    Common audit log format for Google Cloud Platform API operations.
+    Copied from
+    https://github.com/googleapis/googleapis/blob/master/google/cloud/audit/audit_log.proto,
+    but changing service_data from Any to Struct.
+    """
     """Authentication information."""
     authentication_info: Optional[AuthenticationInfo]
     """Authorization information. If there are multiple
@@ -1128,7 +653,7 @@ class ProtoPayload:
     """Other service-specific data about the request, response, and other
     information associated with the current audited event.
     """
-    metadata: Optional[Metadata]
+    metadata: Optional[Dict[str, Any]]
     """The name of the service method or operation.
     For API calls, this should be the name of the API method.
     For example,
@@ -1140,7 +665,7 @@ class ProtoPayload:
     """The number of items returned from a List or Query API method,
     if applicable.
     """
-    num_response_items: Optional[str]
+    num_response_items: Optional[int]
     """The operation request. This may not include all request parameters,
     such as those that are too large, privacy-sensitive, or duplicated
     elsewhere in the log record.
@@ -1148,7 +673,7 @@ class ProtoPayload:
     When the JSON object represented here has a proto equivalent, the proto
     name will be indicated in the `@type` property.
     """
-    request: Optional[Request]
+    request: Optional[Dict[str, Any]]
     """Metadata about the operation."""
     request_metadata: Optional[RequestMetadata]
     """The resource location information."""
@@ -1169,7 +694,7 @@ class ProtoPayload:
     When the JSON object represented here has a proto equivalent,
     the proto name will be indicated in the `@type` property.
     """
-    resource_original_state: Optional[ResourceOriginalState]
+    resource_original_state: Optional[Dict[str, Any]]
     """The operation response. This may not include all response elements,
     such as those that are too large, privacy-sensitive, or duplicated
     elsewhere in the log record.
@@ -1177,14 +702,14 @@ class ProtoPayload:
     When the JSON object represented here has a proto equivalent, the proto
     name will be indicated in the `@type` property.
     """
-    response: Optional[Response]
-    """Deprecated, use `metadata` field instead.
+    response: Optional[Dict[str, Any]]
+    """Deprecated: Use `metadata` field instead.
     Other service-specific data about the request, response, and other
     activities.
     When the JSON object represented here has a proto equivalent, the proto
     name will be indicated in the `@type` property.
     """
-    service_data: Optional[ServiceData]
+    service_data: Optional[Dict[str, Any]]
     """The name of the API service performing the operation. For example,
     `"datastore.googleapis.com"`.
     """
@@ -1192,7 +717,7 @@ class ProtoPayload:
     """The status of the overall operation."""
     status: Optional[Status]
 
-    def __init__(self, authentication_info: Optional[AuthenticationInfo], authorization_info: Optional[List[AuthorizationInfo]], metadata: Optional[Metadata], method_name: Optional[str], num_response_items: Optional[str], request: Optional[Request], request_metadata: Optional[RequestMetadata], resource_location: Optional[ResourceLocation], resource_name: Optional[str], resource_original_state: Optional[ResourceOriginalState], response: Optional[Response], service_data: Optional[ServiceData], service_name: Optional[str], status: Optional[Status]) -> None:
+    def __init__(self, authentication_info: Optional[AuthenticationInfo], authorization_info: Optional[List[AuthorizationInfo]], metadata: Optional[Dict[str, Any]], method_name: Optional[str], num_response_items: Optional[int], request: Optional[Dict[str, Any]], request_metadata: Optional[RequestMetadata], resource_location: Optional[ResourceLocation], resource_name: Optional[str], resource_original_state: Optional[Dict[str, Any]], response: Optional[Dict[str, Any]], service_data: Optional[Dict[str, Any]], service_name: Optional[str], status: Optional[Status]) -> None:
         self.authentication_info = authentication_info
         self.authorization_info = authorization_info
         self.metadata = metadata
@@ -1208,50 +733,20 @@ def __init__(self, authentication_info: Optional[AuthenticationInfo], authorizat
         self.service_name = service_name
         self.status = status
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ProtoPayload':
-        assert isinstance(obj, dict)
-        authentication_info = from_union([AuthenticationInfo.from_dict, from_none], obj.get("authenticationInfo"))
-        authorization_info = from_union([lambda x: from_list(AuthorizationInfo.from_dict, x), from_none], obj.get("authorizationInfo"))
-        metadata = from_union([Metadata.from_dict, from_none], obj.get("metadata"))
-        method_name = from_union([from_str, from_none], obj.get("methodName"))
-        num_response_items = from_union([from_str, from_none], obj.get("numResponseItems"))
-        request = from_union([Request.from_dict, from_none], obj.get("request"))
-        request_metadata = from_union([RequestMetadata.from_dict, from_none], obj.get("requestMetadata"))
-        resource_location = from_union([ResourceLocation.from_dict, from_none], obj.get("resourceLocation"))
-        resource_name = from_union([from_str, from_none], obj.get("resourceName"))
-        resource_original_state = from_union([ResourceOriginalState.from_dict, from_none], obj.get("resourceOriginalState"))
-        response = from_union([Response.from_dict, from_none], obj.get("response"))
-        service_data = from_union([ServiceData.from_dict, from_none], obj.get("serviceData"))
-        service_name = from_union([from_str, from_none], obj.get("serviceName"))
-        status = from_union([Status.from_dict, from_none], obj.get("status"))
-        return ProtoPayload(authentication_info, authorization_info, metadata, method_name, num_response_items, request, request_metadata, resource_location, resource_name, resource_original_state, response, service_data, service_name, status)
 
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["authenticationInfo"] = from_union([lambda x: to_class(AuthenticationInfo, x), from_none], self.authentication_info)
-        result["authorizationInfo"] = from_union([lambda x: from_list(lambda x: to_class(AuthorizationInfo, x), x), from_none], self.authorization_info)
-        result["metadata"] = from_union([lambda x: to_class(Metadata, x), from_none], self.metadata)
-        result["methodName"] = from_union([from_str, from_none], self.method_name)
-        result["numResponseItems"] = from_union([from_str, from_none], self.num_response_items)
-        result["request"] = from_union([lambda x: to_class(Request, x), from_none], self.request)
-        result["requestMetadata"] = from_union([lambda x: to_class(RequestMetadata, x), from_none], self.request_metadata)
-        result["resourceLocation"] = from_union([lambda x: to_class(ResourceLocation, x), from_none], self.resource_location)
-        result["resourceName"] = from_union([from_str, from_none], self.resource_name)
-        result["resourceOriginalState"] = from_union([lambda x: to_class(ResourceOriginalState, x), from_none], self.resource_original_state)
-        result["response"] = from_union([lambda x: to_class(Response, x), from_none], self.response)
-        result["serviceData"] = from_union([lambda x: to_class(ServiceData, x), from_none], self.service_data)
-        result["serviceName"] = from_union([from_str, from_none], self.service_name)
-        result["status"] = from_union([lambda x: to_class(Status, x), from_none], self.status)
-        return result
-
-
-class Resource:
+class ResourceClass:
     """The monitored resource that produced this log entry.
     
     Example: a log entry that reports a database error would be associated with
     the monitored resource designating the particular database that reported
     the error.
+    
+    Note: this is a much-reduced version of the proto at
+    https://github.com/googleapis/googleapis/blob/master/google/api/monitored_resource.proto
+    to avoid other dependencies leaking into events.
+    
+    An object representing a resource that can be used for monitoring, logging,
+    billing, or other purposes.
     """
     """Values for all of the labels listed in the associated monitored
     resource descriptor. For example, Compute Engine VM instances use the
@@ -1267,18 +762,17 @@ def __init__(self, labels: Optional[Dict[str, str]], type: Optional[str]) -> Non
         self.labels = labels
         self.type = type
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Resource':
-        assert isinstance(obj, dict)
-        labels = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("labels"))
-        type = from_union([from_str, from_none], obj.get("type"))
-        return Resource(labels, type)
 
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["labels"] = from_union([lambda x: from_dict(from_str, x), from_none], self.labels)
-        result["type"] = from_union([from_str, from_none], self.type)
-        return result
+class InsertID(Enum):
+    ALERT = "ALERT"
+    CRITICAL = "CRITICAL"
+    DEBUG = "DEBUG"
+    DEFAULT = "DEFAULT"
+    EMERGENCY = "EMERGENCY"
+    ERROR = "ERROR"
+    INFO = "INFO"
+    NOTICE = "NOTICE"
+    WARNING = "WARNING"
 
 
 class LogEntryData:
@@ -1291,9 +785,13 @@ class LogEntryData:
     labels: Optional[Dict[str, str]]
     """The resource name of the log to which this log entry belongs."""
     log_name: Optional[str]
-    """Information about an operation associated with the log entry, if applicable."""
+    """Information about an operation associated with the log entry, if
+    applicable.
+    """
     operation: Optional[Operation]
-    """The log entry payload, which is always an AuditLog for Cloud Audit Log events."""
+    """The log entry payload, which is always an AuditLog for Cloud Audit Log
+    events.
+    """
     proto_payload: Optional[ProtoPayload]
     """The time the log entry was received by Logging."""
     receive_timestamp: Optional[datetime]
@@ -1303,9 +801,9 @@ class LogEntryData:
     the monitored resource designating the particular database that reported
     the error.
     """
-    resource: Optional[Resource]
+    resource: Optional[ResourceClass]
     """The severity of the log entry."""
-    severity: Union[int, None, str]
+    severity: Union[InsertID, int, None]
     """The span ID within the trace associated with the log entry, if any.
     
     For Trace spans, this is the same format that the Trace API v2 uses: a
@@ -1322,7 +820,7 @@ class LogEntryData:
     """
     trace: Optional[str]
 
-    def __init__(self, insert_id: Optional[str], labels: Optional[Dict[str, str]], log_name: Optional[str], operation: Optional[Operation], proto_payload: Optional[ProtoPayload], receive_timestamp: Optional[datetime], resource: Optional[Resource], severity: Union[int, None, str], span_id: Optional[str], timestamp: Optional[datetime], trace: Optional[str]) -> None:
+    def __init__(self, insert_id: Optional[str], labels: Optional[Dict[str, str]], log_name: Optional[str], operation: Optional[Operation], proto_payload: Optional[ProtoPayload], receive_timestamp: Optional[datetime], resource: Optional[ResourceClass], severity: Union[InsertID, int, None], span_id: Optional[str], timestamp: Optional[datetime], trace: Optional[str]) -> None:
         self.insert_id = insert_id
         self.labels = labels
         self.log_name = log_name
@@ -1334,42 +832,3 @@ def __init__(self, insert_id: Optional[str], labels: Optional[Dict[str, str]], l
         self.span_id = span_id
         self.timestamp = timestamp
         self.trace = trace
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'LogEntryData':
-        assert isinstance(obj, dict)
-        insert_id = from_union([from_str, from_none], obj.get("insertId"))
-        labels = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("labels"))
-        log_name = from_union([from_str, from_none], obj.get("logName"))
-        operation = from_union([Operation.from_dict, from_none], obj.get("operation"))
-        proto_payload = from_union([ProtoPayload.from_dict, from_none], obj.get("protoPayload"))
-        receive_timestamp = from_union([from_datetime, from_none], obj.get("receiveTimestamp"))
-        resource = from_union([Resource.from_dict, from_none], obj.get("resource"))
-        severity = from_union([from_int, from_str, from_none], obj.get("severity"))
-        span_id = from_union([from_str, from_none], obj.get("spanId"))
-        timestamp = from_union([from_datetime, from_none], obj.get("timestamp"))
-        trace = from_union([from_str, from_none], obj.get("trace"))
-        return LogEntryData(insert_id, labels, log_name, operation, proto_payload, receive_timestamp, resource, severity, span_id, timestamp, trace)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["insertId"] = from_union([from_str, from_none], self.insert_id)
-        result["labels"] = from_union([lambda x: from_dict(from_str, x), from_none], self.labels)
-        result["logName"] = from_union([from_str, from_none], self.log_name)
-        result["operation"] = from_union([lambda x: to_class(Operation, x), from_none], self.operation)
-        result["protoPayload"] = from_union([lambda x: to_class(ProtoPayload, x), from_none], self.proto_payload)
-        result["receiveTimestamp"] = from_union([lambda x: x.isoformat(), from_none], self.receive_timestamp)
-        result["resource"] = from_union([lambda x: to_class(Resource, x), from_none], self.resource)
-        result["severity"] = from_union([from_int, from_str, from_none], self.severity)
-        result["spanId"] = from_union([from_str, from_none], self.span_id)
-        result["timestamp"] = from_union([lambda x: x.isoformat(), from_none], self.timestamp)
-        result["trace"] = from_union([from_str, from_none], self.trace)
-        return result
-
-
-def log_entry_data_from_dict(s: Any) -> LogEntryData:
-    return LogEntryData.from_dict(s)
-
-
-def log_entry_data_to_dict(x: LogEntryData) -> Any:
-    return to_class(LogEntryData, x)
diff --git a/src/google/events/cloud/cloudbuild/v1/BuildEventData.py b/src/google/events/cloud/cloudbuild/v1/BuildEventData.py
index f8139cd..61ba6e3 100644
--- a/src/google/events/cloud/cloudbuild/v1/BuildEventData.py
+++ b/src/google/events/cloud/cloudbuild/v1/BuildEventData.py
@@ -11,79 +11,9 @@
 # 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 code parses date/times, so please
-#
-#     pip install python-dateutil
-#
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = build_event_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Any, List, Union, Dict, TypeVar, Callable, Type, cast
+from typing import Optional, List, Union, Dict
 from datetime import datetime
 from enum import Enum
-import dateutil.parser
-
-
-T = TypeVar("T")
-EnumT = TypeVar("EnumT", bound=Enum)
-
-
-def from_datetime(x: Any) -> datetime:
-    return dateutil.parser.parse(x)
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
-    assert isinstance(x, list)
-    return [f(y) for y in x]
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
-
-
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
-
-
-def to_enum(c: Type[EnumT], x: Any) -> EnumT:
-    assert isinstance(x, c)
-    return x.value
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
-    return x
 
 
 class ObjectsTiming:
@@ -100,19 +30,6 @@ def __init__(self, end_time: Optional[datetime], start_time: Optional[datetime])
         self.end_time = end_time
         self.start_time = start_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ObjectsTiming':
-        assert isinstance(obj, dict)
-        end_time = from_union([from_datetime, from_none], obj.get("endTime"))
-        start_time = from_union([from_datetime, from_none], obj.get("startTime"))
-        return ObjectsTiming(end_time, start_time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["endTime"] = from_union([lambda x: x.isoformat(), from_none], self.end_time)
-        result["startTime"] = from_union([lambda x: x.isoformat(), from_none], self.start_time)
-        return result
-
 
 class Objects:
     """A list of objects to be uploaded to Cloud Storage upon successful
@@ -126,6 +43,9 @@ class Objects:
     Build resource's results field.
     
     If any objects fail to be pushed, the build is marked FAILURE.
+    
+    Files in the workspace to upload to Cloud Storage upon successful
+    completion of all build steps.
     """
     """Cloud Storage bucket and optional object path, in the form
     "gs://bucket/path/to/somewhere/". (see [Bucket Name
@@ -145,25 +65,13 @@ def __init__(self, location: Optional[str], paths: Optional[List[str]], timing:
         self.paths = paths
         self.timing = timing
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Objects':
-        assert isinstance(obj, dict)
-        location = from_union([from_str, from_none], obj.get("location"))
-        paths = from_union([lambda x: from_list(from_str, x), from_none], obj.get("paths"))
-        timing = from_union([ObjectsTiming.from_dict, from_none], obj.get("timing"))
-        return Objects(location, paths, timing)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["location"] = from_union([from_str, from_none], self.location)
-        result["paths"] = from_union([lambda x: from_list(from_str, x), from_none], self.paths)
-        result["timing"] = from_union([lambda x: to_class(ObjectsTiming, x), from_none], self.timing)
-        return result
-
 
 class Artifacts:
     """Artifacts produced by the build that should be uploaded upon
     successful completion of all build steps.
+    
+    Artifacts produced by a build that should be uploaded upon
+    successful completion of all build steps.
     """
     """A list of images to be pushed upon the successful completion of all build
     steps.
@@ -194,19 +102,6 @@ def __init__(self, images: Optional[List[str]], objects: Optional[Objects]) -> N
         self.images = images
         self.objects = objects
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Artifacts':
-        assert isinstance(obj, dict)
-        images = from_union([lambda x: from_list(from_str, x), from_none], obj.get("images"))
-        objects = from_union([Objects.from_dict, from_none], obj.get("objects"))
-        return Artifacts(images, objects)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["images"] = from_union([lambda x: from_list(from_str, x), from_none], self.images)
-        result["objects"] = from_union([lambda x: to_class(Objects, x), from_none], self.objects)
-        return result
-
 
 class LogStreamingOptionEnum(Enum):
     STREAM_DEFAULT = "STREAM_DEFAULT"
@@ -231,6 +126,12 @@ class RequestedVerifyOptionEnum(Enum):
     VERIFIED = "VERIFIED"
 
 
+class SourceProvenanceHashEnum(Enum):
+    MD5 = "MD5"
+    NONE = "NONE"
+    SHA256 = "SHA256"
+
+
 class SubstitutionOptionEnum(Enum):
     ALLOW_LOOSE = "ALLOW_LOOSE"
     MUST_MATCH = "MUST_MATCH"
@@ -257,22 +158,12 @@ def __init__(self, name: Optional[str], path: Optional[str]) -> None:
         self.name = name
         self.path = path
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Volume':
-        assert isinstance(obj, dict)
-        name = from_union([from_str, from_none], obj.get("name"))
-        path = from_union([from_str, from_none], obj.get("path"))
-        return Volume(name, path)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["path"] = from_union([from_str, from_none], self.path)
-        return result
-
 
 class Options:
-    """Special options for this build."""
+    """Special options for this build.
+    
+    Optional arguments to enable specific features of builds.
+    """
     """Requested disk size for the VM that runs the build. Note that this is *NOT*
     "disk free"; some of the space will be used by the operating system and
     build utilities. Also note that this is the minimum disk size that will be
@@ -280,7 +171,7 @@ class Options:
     requested. At present, the maximum disk size is 1000GB; builds that request
     more than the maximum are rejected with an error.
     """
-    disk_size_gb: Optional[str]
+    disk_size_gb: Optional[int]
     """A list of global environment variable definitions that will exist for all
     build steps in this build. If a variable is defined in both globally and in
     a build step, the variable will use the build step value.
@@ -308,7 +199,7 @@ class Options:
     """
     secret_env: Optional[List[str]]
     """Requested hash for SourceProvenance."""
-    source_provenance_hash: Optional[List[Union[int, str]]]
+    source_provenance_hash: Optional[List[Union[float, SourceProvenanceHashEnum, int]]]
     """Option to specify behavior when there is an error in the substitution
     checks.
     """
@@ -329,7 +220,7 @@ class Options:
     """
     worker_pool: Optional[str]
 
-    def __init__(self, disk_size_gb: Optional[str], env: Optional[List[str]], logging: Union[LoggingEnum, int, None], log_streaming_option: Union[LogStreamingOptionEnum, int, None], machine_type: Union[MachineTypeEnum, int, None], requested_verify_option: Union[RequestedVerifyOptionEnum, int, None], secret_env: Optional[List[str]], source_provenance_hash: Optional[List[Union[int, str]]], substitution_option: Union[SubstitutionOptionEnum, int, None], volumes: Optional[List[Volume]], worker_pool: Optional[str]) -> None:
+    def __init__(self, disk_size_gb: Optional[int], env: Optional[List[str]], logging: Union[LoggingEnum, int, None], log_streaming_option: Union[LogStreamingOptionEnum, int, None], machine_type: Union[MachineTypeEnum, int, None], requested_verify_option: Union[RequestedVerifyOptionEnum, int, None], secret_env: Optional[List[str]], source_provenance_hash: Optional[List[Union[float, SourceProvenanceHashEnum, int]]], substitution_option: Union[SubstitutionOptionEnum, int, None], volumes: Optional[List[Volume]], worker_pool: Optional[str]) -> None:
         self.disk_size_gb = disk_size_gb
         self.env = env
         self.logging = logging
@@ -342,76 +233,6 @@ def __init__(self, disk_size_gb: Optional[str], env: Optional[List[str]], loggin
         self.volumes = volumes
         self.worker_pool = worker_pool
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Options':
-        assert isinstance(obj, dict)
-        disk_size_gb = from_union([from_str, from_none], obj.get("diskSizeGb"))
-        env = from_union([lambda x: from_list(from_str, x), from_none], obj.get("env"))
-        logging = from_union([from_int, LoggingEnum, from_none], obj.get("logging"))
-        log_streaming_option = from_union([from_int, LogStreamingOptionEnum, from_none], obj.get("logStreamingOption"))
-        machine_type = from_union([from_int, MachineTypeEnum, from_none], obj.get("machineType"))
-        requested_verify_option = from_union([from_int, RequestedVerifyOptionEnum, from_none], obj.get("requestedVerifyOption"))
-        secret_env = from_union([lambda x: from_list(from_str, x), from_none], obj.get("secretEnv"))
-        source_provenance_hash = from_union([lambda x: from_list(lambda x: from_union([from_int, from_str], x), x), from_none], obj.get("sourceProvenanceHash"))
-        substitution_option = from_union([from_int, SubstitutionOptionEnum, from_none], obj.get("substitutionOption"))
-        volumes = from_union([lambda x: from_list(Volume.from_dict, x), from_none], obj.get("volumes"))
-        worker_pool = from_union([from_str, from_none], obj.get("workerPool"))
-        return Options(disk_size_gb, env, logging, log_streaming_option, machine_type, requested_verify_option, secret_env, source_provenance_hash, substitution_option, volumes, worker_pool)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["diskSizeGb"] = from_union([from_str, from_none], self.disk_size_gb)
-        result["env"] = from_union([lambda x: from_list(from_str, x), from_none], self.env)
-        result["logging"] = from_union([from_int, lambda x: to_enum(LoggingEnum, x), from_none], self.logging)
-        result["logStreamingOption"] = from_union([from_int, lambda x: to_enum(LogStreamingOptionEnum, x), from_none], self.log_streaming_option)
-        result["machineType"] = from_union([from_int, lambda x: to_enum(MachineTypeEnum, x), from_none], self.machine_type)
-        result["requestedVerifyOption"] = from_union([from_int, lambda x: to_enum(RequestedVerifyOptionEnum, x), from_none], self.requested_verify_option)
-        result["secretEnv"] = from_union([lambda x: from_list(from_str, x), from_none], self.secret_env)
-        result["sourceProvenanceHash"] = from_union([lambda x: from_list(lambda x: from_union([from_int, from_str], x), x), from_none], self.source_provenance_hash)
-        result["substitutionOption"] = from_union([from_int, lambda x: to_enum(SubstitutionOptionEnum, x), from_none], self.substitution_option)
-        result["volumes"] = from_union([lambda x: from_list(lambda x: to_class(Volume, x), x), from_none], self.volumes)
-        result["workerPool"] = from_union([from_str, from_none], self.worker_pool)
-        return result
-
-
-class QueueTTL:
-    """TTL in queue for this build. If provided and the build is enqueued longer
-    than this value, the build will expire and the build status will be
-    `EXPIRED`.
-    
-    The TTL starts ticking from create_time.
-    """
-    """Signed fractions of a second at nanosecond resolution of the span
-    of time. Durations less than one second are represented with a 0
-    `seconds` field and a positive or negative `nanos` field. For durations
-    of one second or more, a non-zero value for the `nanos` field must be
-    of the same sign as the `seconds` field. Must be from -999,999,999
-    to +999,999,999 inclusive.
-    """
-    nanos: Optional[int]
-    """Signed seconds of the span of time. Must be from -315,576,000,000
-    to +315,576,000,000 inclusive. Note: these bounds are computed from:
-    60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-    """
-    seconds: Optional[str]
-
-    def __init__(self, nanos: Optional[int], seconds: Optional[str]) -> None:
-        self.nanos = nanos
-        self.seconds = seconds
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'QueueTTL':
-        assert isinstance(obj, dict)
-        nanos = from_union([from_int, from_none], obj.get("nanos"))
-        seconds = from_union([from_str, from_none], obj.get("seconds"))
-        return QueueTTL(nanos, seconds)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["nanos"] = from_union([from_int, from_none], self.nanos)
-        result["seconds"] = from_union([from_str, from_none], self.seconds)
-        return result
-
 
 class ArtifactTiming:
     """Time to push all non-container artifacts.
@@ -429,19 +250,6 @@ def __init__(self, end_time: Optional[datetime], start_time: Optional[datetime])
         self.end_time = end_time
         self.start_time = start_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ArtifactTiming':
-        assert isinstance(obj, dict)
-        end_time = from_union([from_datetime, from_none], obj.get("endTime"))
-        start_time = from_union([from_datetime, from_none], obj.get("startTime"))
-        return ArtifactTiming(end_time, start_time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["endTime"] = from_union([lambda x: x.isoformat(), from_none], self.end_time)
-        result["startTime"] = from_union([lambda x: x.isoformat(), from_none], self.start_time)
-        return result
-
 
 class PushTiming:
     """Stores timing information for pushing the specified image.
@@ -459,21 +267,8 @@ def __init__(self, end_time: Optional[datetime], start_time: Optional[datetime])
         self.end_time = end_time
         self.start_time = start_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'PushTiming':
-        assert isinstance(obj, dict)
-        end_time = from_union([from_datetime, from_none], obj.get("endTime"))
-        start_time = from_union([from_datetime, from_none], obj.get("startTime"))
-        return PushTiming(end_time, start_time)
 
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["endTime"] = from_union([lambda x: x.isoformat(), from_none], self.end_time)
-        result["startTime"] = from_union([lambda x: x.isoformat(), from_none], self.start_time)
-        return result
-
-
-class Image:
+class BuiltImage:
     """An image built by the pipeline."""
     """Docker Registry 2.0 digest."""
     digest: Optional[str]
@@ -489,24 +284,12 @@ def __init__(self, digest: Optional[str], name: Optional[str], push_timing: Opti
         self.name = name
         self.push_timing = push_timing
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Image':
-        assert isinstance(obj, dict)
-        digest = from_union([from_str, from_none], obj.get("digest"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        push_timing = from_union([PushTiming.from_dict, from_none], obj.get("pushTiming"))
-        return Image(digest, name, push_timing)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["digest"] = from_union([from_str, from_none], self.digest)
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["pushTiming"] = from_union([lambda x: to_class(PushTiming, x), from_none], self.push_timing)
-        return result
-
 
 class Results:
-    """Results of the build."""
+    """Results of the build.
+    
+    Artifacts created by the build pipeline.
+    """
     """Path to the artifact manifest. Only populated when artifacts are uploaded."""
     artifact_manifest: Optional[str]
     """Time to push all non-container artifacts."""
@@ -524,11 +307,11 @@ class Results:
     """
     build_step_outputs: Optional[List[str]]
     """Container images that were built as a part of the build."""
-    images: Optional[List[Image]]
+    images: Optional[List[BuiltImage]]
     """Number of artifacts uploaded. Only populated when artifacts are uploaded."""
-    num_artifacts: Optional[str]
+    num_artifacts: Optional[int]
 
-    def __init__(self, artifact_manifest: Optional[str], artifact_timing: Optional[ArtifactTiming], build_step_images: Optional[List[str]], build_step_outputs: Optional[List[str]], images: Optional[List[Image]], num_artifacts: Optional[str]) -> None:
+    def __init__(self, artifact_manifest: Optional[str], artifact_timing: Optional[ArtifactTiming], build_step_images: Optional[List[str]], build_step_outputs: Optional[List[str]], images: Optional[List[BuiltImage]], num_artifacts: Optional[int]) -> None:
         self.artifact_manifest = artifact_manifest
         self.artifact_timing = artifact_timing
         self.build_step_images = build_step_images
@@ -536,27 +319,6 @@ def __init__(self, artifact_manifest: Optional[str], artifact_timing: Optional[A
         self.images = images
         self.num_artifacts = num_artifacts
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Results':
-        assert isinstance(obj, dict)
-        artifact_manifest = from_union([from_str, from_none], obj.get("artifactManifest"))
-        artifact_timing = from_union([ArtifactTiming.from_dict, from_none], obj.get("artifactTiming"))
-        build_step_images = from_union([lambda x: from_list(from_str, x), from_none], obj.get("buildStepImages"))
-        build_step_outputs = from_union([lambda x: from_list(from_str, x), from_none], obj.get("buildStepOutputs"))
-        images = from_union([lambda x: from_list(Image.from_dict, x), from_none], obj.get("images"))
-        num_artifacts = from_union([from_str, from_none], obj.get("numArtifacts"))
-        return Results(artifact_manifest, artifact_timing, build_step_images, build_step_outputs, images, num_artifacts)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["artifactManifest"] = from_union([from_str, from_none], self.artifact_manifest)
-        result["artifactTiming"] = from_union([lambda x: to_class(ArtifactTiming, x), from_none], self.artifact_timing)
-        result["buildStepImages"] = from_union([lambda x: from_list(from_str, x), from_none], self.build_step_images)
-        result["buildStepOutputs"] = from_union([lambda x: from_list(from_str, x), from_none], self.build_step_outputs)
-        result["images"] = from_union([lambda x: from_list(lambda x: to_class(Image, x), x), from_none], self.images)
-        result["numArtifacts"] = from_union([from_str, from_none], self.num_artifacts)
-        return result
-
 
 class Secret:
     """Pairs a set of secret environment variables containing encrypted
@@ -577,19 +339,6 @@ def __init__(self, kms_key_name: Optional[str], secret_env: Optional[Dict[str, s
         self.kms_key_name = kms_key_name
         self.secret_env = secret_env
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Secret':
-        assert isinstance(obj, dict)
-        kms_key_name = from_union([from_str, from_none], obj.get("kmsKeyName"))
-        secret_env = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("secretEnv"))
-        return Secret(kms_key_name, secret_env)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["kmsKeyName"] = from_union([from_str, from_none], self.kms_key_name)
-        result["secretEnv"] = from_union([lambda x: from_dict(from_str, x), from_none], self.secret_env)
-        return result
-
 
 class RepoSourceClass:
     """If provided, get the source from this location in a Cloud Source
@@ -640,31 +389,6 @@ def __init__(self, branch_name: Optional[str], commit_sha: Optional[str], dir: O
         self.substitutions = substitutions
         self.tag_name = tag_name
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'RepoSourceClass':
-        assert isinstance(obj, dict)
-        branch_name = from_union([from_str, from_none], obj.get("branchName"))
-        commit_sha = from_union([from_str, from_none], obj.get("commitSha"))
-        dir = from_union([from_str, from_none], obj.get("dir"))
-        invert_regex = from_union([from_bool, from_none], obj.get("invertRegex"))
-        project_id = from_union([from_str, from_none], obj.get("projectId"))
-        repo_name = from_union([from_str, from_none], obj.get("repoName"))
-        substitutions = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("substitutions"))
-        tag_name = from_union([from_str, from_none], obj.get("tagName"))
-        return RepoSourceClass(branch_name, commit_sha, dir, invert_regex, project_id, repo_name, substitutions, tag_name)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["branchName"] = from_union([from_str, from_none], self.branch_name)
-        result["commitSha"] = from_union([from_str, from_none], self.commit_sha)
-        result["dir"] = from_union([from_str, from_none], self.dir)
-        result["invertRegex"] = from_union([from_bool, from_none], self.invert_regex)
-        result["projectId"] = from_union([from_str, from_none], self.project_id)
-        result["repoName"] = from_union([from_str, from_none], self.repo_name)
-        result["substitutions"] = from_union([lambda x: from_dict(from_str, x), from_none], self.substitutions)
-        result["tagName"] = from_union([from_str, from_none], self.tag_name)
-        return result
-
 
 class StorageSourceClass:
     """If provided, get the source from this location in Google Cloud Storage.
@@ -679,30 +403,15 @@ class StorageSourceClass:
     """Google Cloud Storage generation for the object. If the generation is
     omitted, the latest generation will be used.
     """
-    generation: Optional[str]
+    generation: Optional[int]
     """Google Cloud Storage object containing the source."""
     object: Optional[str]
 
-    def __init__(self, bucket: Optional[str], generation: Optional[str], object: Optional[str]) -> None:
+    def __init__(self, bucket: Optional[str], generation: Optional[int], object: Optional[str]) -> None:
         self.bucket = bucket
         self.generation = generation
         self.object = object
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'StorageSourceClass':
-        assert isinstance(obj, dict)
-        bucket = from_union([from_str, from_none], obj.get("bucket"))
-        generation = from_union([from_str, from_none], obj.get("generation"))
-        object = from_union([from_str, from_none], obj.get("object"))
-        return StorageSourceClass(bucket, generation, object)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["bucket"] = from_union([from_str, from_none], self.bucket)
-        result["generation"] = from_union([from_str, from_none], self.generation)
-        result["object"] = from_union([from_str, from_none], self.object)
-        return result
-
 
 class Source:
     """The location of the source files to build."""
@@ -717,69 +426,29 @@ def __init__(self, repo_source: Optional[RepoSourceClass], storage_source: Optio
         self.repo_source = repo_source
         self.storage_source = storage_source
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Source':
-        assert isinstance(obj, dict)
-        repo_source = from_union([RepoSourceClass.from_dict, from_none], obj.get("repoSource"))
-        storage_source = from_union([StorageSourceClass.from_dict, from_none], obj.get("storageSource"))
-        return Source(repo_source, storage_source)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["repoSource"] = from_union([lambda x: to_class(RepoSourceClass, x), from_none], self.repo_source)
-        result["storageSource"] = from_union([lambda x: to_class(StorageSourceClass, x), from_none], self.storage_source)
-        return result
 
-
-class TypeEnum(Enum):
-    MD5 = "MD5"
-    NONE = "NONE"
-    SHA256 = "SHA256"
-
-
-class FileHashElement:
+class Hash:
     """Container message for hash values."""
     """The type of hash that was performed."""
-    type: Union[TypeEnum, int, None]
+    type: Union[SourceProvenanceHashEnum, int, None]
     """The hash value."""
     value: Optional[str]
 
-    def __init__(self, type: Union[TypeEnum, int, None], value: Optional[str]) -> None:
+    def __init__(self, type: Union[SourceProvenanceHashEnum, int, None], value: Optional[str]) -> None:
         self.type = type
         self.value = value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'FileHashElement':
-        assert isinstance(obj, dict)
-        type = from_union([from_int, TypeEnum, from_none], obj.get("type"))
-        value = from_union([from_str, from_none], obj.get("value"))
-        return FileHashElement(type, value)
 
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["type"] = from_union([from_int, lambda x: to_enum(TypeEnum, x), from_none], self.type)
-        result["value"] = from_union([from_str, from_none], self.value)
-        return result
-
-
-class FileHashValue:
+class FileHashes:
+    """Container message for hashes of byte content of files, used in
+    SourceProvenance messages to verify integrity of source input to the build.
+    """
     """Collection of file hashes."""
-    file_hash: Optional[List[FileHashElement]]
+    file_hash: Optional[List[Hash]]
 
-    def __init__(self, file_hash: Optional[List[FileHashElement]]) -> None:
+    def __init__(self, file_hash: Optional[List[Hash]]) -> None:
         self.file_hash = file_hash
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'FileHashValue':
-        assert isinstance(obj, dict)
-        file_hash = from_union([lambda x: from_list(FileHashElement.from_dict, x), from_none], obj.get("fileHash"))
-        return FileHashValue(file_hash)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fileHash"] = from_union([lambda x: from_list(lambda x: to_class(FileHashElement, x), x), from_none], self.file_hash)
-        return result
-
 
 class ResolvedRepoSourceClass:
     """A copy of the build's `source.repo_source`, if exists, with any
@@ -833,31 +502,6 @@ def __init__(self, branch_name: Optional[str], commit_sha: Optional[str], dir: O
         self.substitutions = substitutions
         self.tag_name = tag_name
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ResolvedRepoSourceClass':
-        assert isinstance(obj, dict)
-        branch_name = from_union([from_str, from_none], obj.get("branchName"))
-        commit_sha = from_union([from_str, from_none], obj.get("commitSha"))
-        dir = from_union([from_str, from_none], obj.get("dir"))
-        invert_regex = from_union([from_bool, from_none], obj.get("invertRegex"))
-        project_id = from_union([from_str, from_none], obj.get("projectId"))
-        repo_name = from_union([from_str, from_none], obj.get("repoName"))
-        substitutions = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("substitutions"))
-        tag_name = from_union([from_str, from_none], obj.get("tagName"))
-        return ResolvedRepoSourceClass(branch_name, commit_sha, dir, invert_regex, project_id, repo_name, substitutions, tag_name)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["branchName"] = from_union([from_str, from_none], self.branch_name)
-        result["commitSha"] = from_union([from_str, from_none], self.commit_sha)
-        result["dir"] = from_union([from_str, from_none], self.dir)
-        result["invertRegex"] = from_union([from_bool, from_none], self.invert_regex)
-        result["projectId"] = from_union([from_str, from_none], self.project_id)
-        result["repoName"] = from_union([from_str, from_none], self.repo_name)
-        result["substitutions"] = from_union([lambda x: from_dict(from_str, x), from_none], self.substitutions)
-        result["tagName"] = from_union([from_str, from_none], self.tag_name)
-        return result
-
 
 class ResolvedStorageSourceClass:
     """A copy of the build's `source.storage_source`, if exists, with any
@@ -875,33 +519,22 @@ class ResolvedStorageSourceClass:
     """Google Cloud Storage generation for the object. If the generation is
     omitted, the latest generation will be used.
     """
-    generation: Optional[str]
+    generation: Optional[int]
     """Google Cloud Storage object containing the source."""
     object: Optional[str]
 
-    def __init__(self, bucket: Optional[str], generation: Optional[str], object: Optional[str]) -> None:
+    def __init__(self, bucket: Optional[str], generation: Optional[int], object: Optional[str]) -> None:
         self.bucket = bucket
         self.generation = generation
         self.object = object
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ResolvedStorageSourceClass':
-        assert isinstance(obj, dict)
-        bucket = from_union([from_str, from_none], obj.get("bucket"))
-        generation = from_union([from_str, from_none], obj.get("generation"))
-        object = from_union([from_str, from_none], obj.get("object"))
-        return ResolvedStorageSourceClass(bucket, generation, object)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["bucket"] = from_union([from_str, from_none], self.bucket)
-        result["generation"] = from_union([from_str, from_none], self.generation)
-        result["object"] = from_union([from_str, from_none], self.object)
-        return result
-
 
 class SourceProvenance:
-    """A permanent fixed identifier for source."""
+    """A permanent fixed identifier for source.
+    
+    Provenance of the source. Ways to find the original source, or verify that
+    some source was used for this build.
+    """
     """Hash(es) of the build source, which can be used to verify that
     the original source integrity was maintained in the build. Note that
     `FileHashes` will only be populated if `BuildOptions` has requested a
@@ -913,7 +546,7 @@ class SourceProvenance:
     If the build source came in a single package such as a gzipped tarfile
     (`.tar.gz`), the `FileHash` will be for the single path to that file.
     """
-    file_hashes: Optional[Dict[str, FileHashValue]]
+    file_hashes: Optional[Dict[str, FileHashes]]
     """A copy of the build's `source.repo_source`, if exists, with any
     revisions resolved.
     """
@@ -923,26 +556,11 @@ class SourceProvenance:
     """
     resolved_storage_source: Optional[ResolvedStorageSourceClass]
 
-    def __init__(self, file_hashes: Optional[Dict[str, FileHashValue]], resolved_repo_source: Optional[ResolvedRepoSourceClass], resolved_storage_source: Optional[ResolvedStorageSourceClass]) -> None:
+    def __init__(self, file_hashes: Optional[Dict[str, FileHashes]], resolved_repo_source: Optional[ResolvedRepoSourceClass], resolved_storage_source: Optional[ResolvedStorageSourceClass]) -> None:
         self.file_hashes = file_hashes
         self.resolved_repo_source = resolved_repo_source
         self.resolved_storage_source = resolved_storage_source
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'SourceProvenance':
-        assert isinstance(obj, dict)
-        file_hashes = from_union([lambda x: from_dict(FileHashValue.from_dict, x), from_none], obj.get("fileHashes"))
-        resolved_repo_source = from_union([ResolvedRepoSourceClass.from_dict, from_none], obj.get("resolvedRepoSource"))
-        resolved_storage_source = from_union([ResolvedStorageSourceClass.from_dict, from_none], obj.get("resolvedStorageSource"))
-        return SourceProvenance(file_hashes, resolved_repo_source, resolved_storage_source)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fileHashes"] = from_union([lambda x: from_dict(lambda x: to_class(FileHashValue, x), x), from_none], self.file_hashes)
-        result["resolvedRepoSource"] = from_union([lambda x: to_class(ResolvedRepoSourceClass, x), from_none], self.resolved_repo_source)
-        result["resolvedStorageSource"] = from_union([lambda x: to_class(ResolvedStorageSourceClass, x), from_none], self.resolved_storage_source)
-        return result
-
 
 class StatusEnum(Enum):
     CANCELLED = "CANCELLED"
@@ -973,56 +591,6 @@ def __init__(self, end_time: Optional[datetime], start_time: Optional[datetime])
         self.end_time = end_time
         self.start_time = start_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'PullTiming':
-        assert isinstance(obj, dict)
-        end_time = from_union([from_datetime, from_none], obj.get("endTime"))
-        start_time = from_union([from_datetime, from_none], obj.get("startTime"))
-        return PullTiming(end_time, start_time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["endTime"] = from_union([lambda x: x.isoformat(), from_none], self.end_time)
-        result["startTime"] = from_union([lambda x: x.isoformat(), from_none], self.start_time)
-        return result
-
-
-class StepTimeout:
-    """Time limit for executing this build step. If not defined, the step has no
-    time limit and will be allowed to continue to run until either it completes
-    or the build itself times out.
-    """
-    """Signed fractions of a second at nanosecond resolution of the span
-    of time. Durations less than one second are represented with a 0
-    `seconds` field and a positive or negative `nanos` field. For durations
-    of one second or more, a non-zero value for the `nanos` field must be
-    of the same sign as the `seconds` field. Must be from -999,999,999
-    to +999,999,999 inclusive.
-    """
-    nanos: Optional[int]
-    """Signed seconds of the span of time. Must be from -315,576,000,000
-    to +315,576,000,000 inclusive. Note: these bounds are computed from:
-    60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-    """
-    seconds: Optional[str]
-
-    def __init__(self, nanos: Optional[int], seconds: Optional[str]) -> None:
-        self.nanos = nanos
-        self.seconds = seconds
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'StepTimeout':
-        assert isinstance(obj, dict)
-        nanos = from_union([from_int, from_none], obj.get("nanos"))
-        seconds = from_union([from_str, from_none], obj.get("seconds"))
-        return StepTimeout(nanos, seconds)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["nanos"] = from_union([from_int, from_none], self.nanos)
-        result["seconds"] = from_union([from_str, from_none], self.seconds)
-        return result
-
 
 class StepTiming:
     """Stores timing information for executing this build step.
@@ -1040,21 +608,8 @@ def __init__(self, end_time: Optional[datetime], start_time: Optional[datetime])
         self.end_time = end_time
         self.start_time = start_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'StepTiming':
-        assert isinstance(obj, dict)
-        end_time = from_union([from_datetime, from_none], obj.get("endTime"))
-        start_time = from_union([from_datetime, from_none], obj.get("startTime"))
-        return StepTiming(end_time, start_time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["endTime"] = from_union([lambda x: x.isoformat(), from_none], self.end_time)
-        result["startTime"] = from_union([lambda x: x.isoformat(), from_none], self.start_time)
-        return result
 
-
-class Step:
+class BuildStep:
     """A step in the build pipeline."""
     """A list of arguments that will be presented to the step when it is started.
     
@@ -1123,12 +678,12 @@ class Step:
     only updated on build completion; step status is not updated in real-time
     as the build progresses.
     """
-    status: Union[int, None, str]
+    status: Union[StatusEnum, int, None]
     """Time limit for executing this build step. If not defined, the step has no
     time limit and will be allowed to continue to run until either it completes
     or the build itself times out.
     """
-    timeout: Optional[StepTimeout]
+    timeout: Optional[str]
     """Stores timing information for executing this build step."""
     timing: Optional[StepTiming]
     """List of volumes to mount into the build step.
@@ -1149,7 +704,7 @@ class Step:
     """
     wait_for: Optional[List[str]]
 
-    def __init__(self, args: Optional[List[str]], dir: Optional[str], entrypoint: Optional[str], env: Optional[List[str]], id: Optional[str], name: Optional[str], pull_timing: Optional[PullTiming], secret_env: Optional[List[str]], status: Union[int, None, str], timeout: Optional[StepTimeout], timing: Optional[StepTiming], volumes: Optional[List[Volume]], wait_for: Optional[List[str]]) -> None:
+    def __init__(self, args: Optional[List[str]], dir: Optional[str], entrypoint: Optional[str], env: Optional[List[str]], id: Optional[str], name: Optional[str], pull_timing: Optional[PullTiming], secret_env: Optional[List[str]], status: Union[StatusEnum, int, None], timeout: Optional[str], timing: Optional[StepTiming], volumes: Optional[List[Volume]], wait_for: Optional[List[str]]) -> None:
         self.args = args
         self.dir = dir
         self.entrypoint = entrypoint
@@ -1164,78 +719,6 @@ def __init__(self, args: Optional[List[str]], dir: Optional[str], entrypoint: Op
         self.volumes = volumes
         self.wait_for = wait_for
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Step':
-        assert isinstance(obj, dict)
-        args = from_union([lambda x: from_list(from_str, x), from_none], obj.get("args"))
-        dir = from_union([from_str, from_none], obj.get("dir"))
-        entrypoint = from_union([from_str, from_none], obj.get("entrypoint"))
-        env = from_union([lambda x: from_list(from_str, x), from_none], obj.get("env"))
-        id = from_union([from_str, from_none], obj.get("id"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        pull_timing = from_union([PullTiming.from_dict, from_none], obj.get("pullTiming"))
-        secret_env = from_union([lambda x: from_list(from_str, x), from_none], obj.get("secretEnv"))
-        status = from_union([from_int, from_str, from_none], obj.get("status"))
-        timeout = from_union([StepTimeout.from_dict, from_none], obj.get("timeout"))
-        timing = from_union([StepTiming.from_dict, from_none], obj.get("timing"))
-        volumes = from_union([lambda x: from_list(Volume.from_dict, x), from_none], obj.get("volumes"))
-        wait_for = from_union([lambda x: from_list(from_str, x), from_none], obj.get("waitFor"))
-        return Step(args, dir, entrypoint, env, id, name, pull_timing, secret_env, status, timeout, timing, volumes, wait_for)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["args"] = from_union([lambda x: from_list(from_str, x), from_none], self.args)
-        result["dir"] = from_union([from_str, from_none], self.dir)
-        result["entrypoint"] = from_union([from_str, from_none], self.entrypoint)
-        result["env"] = from_union([lambda x: from_list(from_str, x), from_none], self.env)
-        result["id"] = from_union([from_str, from_none], self.id)
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["pullTiming"] = from_union([lambda x: to_class(PullTiming, x), from_none], self.pull_timing)
-        result["secretEnv"] = from_union([lambda x: from_list(from_str, x), from_none], self.secret_env)
-        result["status"] = from_union([from_int, from_str, from_none], self.status)
-        result["timeout"] = from_union([lambda x: to_class(StepTimeout, x), from_none], self.timeout)
-        result["timing"] = from_union([lambda x: to_class(StepTiming, x), from_none], self.timing)
-        result["volumes"] = from_union([lambda x: from_list(lambda x: to_class(Volume, x), x), from_none], self.volumes)
-        result["waitFor"] = from_union([lambda x: from_list(from_str, x), from_none], self.wait_for)
-        return result
-
-
-class BuildEventDataTimeout:
-    """Amount of time that this build should be allowed to run, to second
-    granularity. If this amount of time elapses, work on the build will cease
-    and the build status will be `TIMEOUT`.
-    """
-    """Signed fractions of a second at nanosecond resolution of the span
-    of time. Durations less than one second are represented with a 0
-    `seconds` field and a positive or negative `nanos` field. For durations
-    of one second or more, a non-zero value for the `nanos` field must be
-    of the same sign as the `seconds` field. Must be from -999,999,999
-    to +999,999,999 inclusive.
-    """
-    nanos: Optional[int]
-    """Signed seconds of the span of time. Must be from -315,576,000,000
-    to +315,576,000,000 inclusive. Note: these bounds are computed from:
-    60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
-    """
-    seconds: Optional[str]
-
-    def __init__(self, nanos: Optional[int], seconds: Optional[str]) -> None:
-        self.nanos = nanos
-        self.seconds = seconds
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'BuildEventDataTimeout':
-        assert isinstance(obj, dict)
-        nanos = from_union([from_int, from_none], obj.get("nanos"))
-        seconds = from_union([from_str, from_none], obj.get("seconds"))
-        return BuildEventDataTimeout(nanos, seconds)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["nanos"] = from_union([from_int, from_none], self.nanos)
-        result["seconds"] = from_union([from_str, from_none], self.seconds)
-        return result
-
 
 class TimeSpan:
     """Stores timing information for pushing all artifact objects.
@@ -1251,19 +734,6 @@ def __init__(self, end_time: Optional[datetime], start_time: Optional[datetime])
         self.end_time = end_time
         self.start_time = start_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'TimeSpan':
-        assert isinstance(obj, dict)
-        end_time = from_union([from_datetime, from_none], obj.get("endTime"))
-        start_time = from_union([from_datetime, from_none], obj.get("startTime"))
-        return TimeSpan(end_time, start_time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["endTime"] = from_union([lambda x: x.isoformat(), from_none], self.end_time)
-        result["startTime"] = from_union([lambda x: x.isoformat(), from_none], self.start_time)
-        return result
-
 
 class BuildEventData:
     """Build event data for Google Cloud Platform API operations."""
@@ -1315,7 +785,7 @@ class BuildEventData:
     
     The TTL starts ticking from create_time.
     """
-    queue_ttl: Optional[QueueTTL]
+    queue_ttl: Optional[str]
     """Results of the build."""
     results: Optional[Results]
     """Secrets to decrypt using Cloud Key Management Service."""
@@ -1331,7 +801,7 @@ class BuildEventData:
     """Customer-readable message about the current status."""
     status_detail: Optional[str]
     """The operations to be performed on the workspace."""
-    steps: Optional[List[Step]]
+    steps: Optional[List[BuildStep]]
     """Substitutions data for `Build` resource."""
     substitutions: Optional[Dict[str, str]]
     """Tags for annotation of a `Build`. These are not docker tags."""
@@ -1340,7 +810,7 @@ class BuildEventData:
     granularity. If this amount of time elapses, work on the build will cease
     and the build status will be `TIMEOUT`.
     """
-    timeout: Optional[BuildEventDataTimeout]
+    timeout: Optional[str]
     """Stores timing information for phases of the build. Valid keys
     are:
     
@@ -1353,7 +823,7 @@ class BuildEventData:
     """
     timing: Optional[Dict[str, TimeSpan]]
 
-    def __init__(self, artifacts: Optional[Artifacts], build_trigger_id: Optional[str], create_time: Optional[datetime], finish_time: Optional[datetime], id: Optional[str], images: Optional[List[str]], logs_bucket: Optional[str], log_url: Optional[str], options: Optional[Options], project_id: Optional[str], queue_ttl: Optional[QueueTTL], results: Optional[Results], secrets: Optional[List[Secret]], source: Optional[Source], source_provenance: Optional[SourceProvenance], start_time: Optional[datetime], status: Union[StatusEnum, int, None], status_detail: Optional[str], steps: Optional[List[Step]], substitutions: Optional[Dict[str, str]], tags: Optional[List[str]], timeout: Optional[BuildEventDataTimeout], timing: Optional[Dict[str, TimeSpan]]) -> None:
+    def __init__(self, artifacts: Optional[Artifacts], build_trigger_id: Optional[str], create_time: Optional[datetime], finish_time: Optional[datetime], id: Optional[str], images: Optional[List[str]], logs_bucket: Optional[str], log_url: Optional[str], options: Optional[Options], project_id: Optional[str], queue_ttl: Optional[str], results: Optional[Results], secrets: Optional[List[Secret]], source: Optional[Source], source_provenance: Optional[SourceProvenance], start_time: Optional[datetime], status: Union[StatusEnum, int, None], status_detail: Optional[str], steps: Optional[List[BuildStep]], substitutions: Optional[Dict[str, str]], tags: Optional[List[str]], timeout: Optional[str], timing: Optional[Dict[str, TimeSpan]]) -> None:
         self.artifacts = artifacts
         self.build_trigger_id = build_trigger_id
         self.create_time = create_time
@@ -1377,66 +847,3 @@ def __init__(self, artifacts: Optional[Artifacts], build_trigger_id: Optional[st
         self.tags = tags
         self.timeout = timeout
         self.timing = timing
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'BuildEventData':
-        assert isinstance(obj, dict)
-        artifacts = from_union([Artifacts.from_dict, from_none], obj.get("artifacts"))
-        build_trigger_id = from_union([from_str, from_none], obj.get("buildTriggerId"))
-        create_time = from_union([from_datetime, from_none], obj.get("createTime"))
-        finish_time = from_union([from_datetime, from_none], obj.get("finishTime"))
-        id = from_union([from_str, from_none], obj.get("id"))
-        images = from_union([lambda x: from_list(from_str, x), from_none], obj.get("images"))
-        logs_bucket = from_union([from_str, from_none], obj.get("logsBucket"))
-        log_url = from_union([from_str, from_none], obj.get("logUrl"))
-        options = from_union([Options.from_dict, from_none], obj.get("options"))
-        project_id = from_union([from_str, from_none], obj.get("projectId"))
-        queue_ttl = from_union([QueueTTL.from_dict, from_none], obj.get("queueTtl"))
-        results = from_union([Results.from_dict, from_none], obj.get("results"))
-        secrets = from_union([lambda x: from_list(Secret.from_dict, x), from_none], obj.get("secrets"))
-        source = from_union([Source.from_dict, from_none], obj.get("source"))
-        source_provenance = from_union([SourceProvenance.from_dict, from_none], obj.get("sourceProvenance"))
-        start_time = from_union([from_datetime, from_none], obj.get("startTime"))
-        status = from_union([from_int, StatusEnum, from_none], obj.get("status"))
-        status_detail = from_union([from_str, from_none], obj.get("statusDetail"))
-        steps = from_union([lambda x: from_list(Step.from_dict, x), from_none], obj.get("steps"))
-        substitutions = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("substitutions"))
-        tags = from_union([lambda x: from_list(from_str, x), from_none], obj.get("tags"))
-        timeout = from_union([BuildEventDataTimeout.from_dict, from_none], obj.get("timeout"))
-        timing = from_union([lambda x: from_dict(TimeSpan.from_dict, x), from_none], obj.get("timing"))
-        return BuildEventData(artifacts, build_trigger_id, create_time, finish_time, id, images, logs_bucket, log_url, options, project_id, queue_ttl, results, secrets, source, source_provenance, start_time, status, status_detail, steps, substitutions, tags, timeout, timing)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["artifacts"] = from_union([lambda x: to_class(Artifacts, x), from_none], self.artifacts)
-        result["buildTriggerId"] = from_union([from_str, from_none], self.build_trigger_id)
-        result["createTime"] = from_union([lambda x: x.isoformat(), from_none], self.create_time)
-        result["finishTime"] = from_union([lambda x: x.isoformat(), from_none], self.finish_time)
-        result["id"] = from_union([from_str, from_none], self.id)
-        result["images"] = from_union([lambda x: from_list(from_str, x), from_none], self.images)
-        result["logsBucket"] = from_union([from_str, from_none], self.logs_bucket)
-        result["logUrl"] = from_union([from_str, from_none], self.log_url)
-        result["options"] = from_union([lambda x: to_class(Options, x), from_none], self.options)
-        result["projectId"] = from_union([from_str, from_none], self.project_id)
-        result["queueTtl"] = from_union([lambda x: to_class(QueueTTL, x), from_none], self.queue_ttl)
-        result["results"] = from_union([lambda x: to_class(Results, x), from_none], self.results)
-        result["secrets"] = from_union([lambda x: from_list(lambda x: to_class(Secret, x), x), from_none], self.secrets)
-        result["source"] = from_union([lambda x: to_class(Source, x), from_none], self.source)
-        result["sourceProvenance"] = from_union([lambda x: to_class(SourceProvenance, x), from_none], self.source_provenance)
-        result["startTime"] = from_union([lambda x: x.isoformat(), from_none], self.start_time)
-        result["status"] = from_union([from_int, lambda x: to_enum(StatusEnum, x), from_none], self.status)
-        result["statusDetail"] = from_union([from_str, from_none], self.status_detail)
-        result["steps"] = from_union([lambda x: from_list(lambda x: to_class(Step, x), x), from_none], self.steps)
-        result["substitutions"] = from_union([lambda x: from_dict(from_str, x), from_none], self.substitutions)
-        result["tags"] = from_union([lambda x: from_list(from_str, x), from_none], self.tags)
-        result["timeout"] = from_union([lambda x: to_class(BuildEventDataTimeout, x), from_none], self.timeout)
-        result["timing"] = from_union([lambda x: from_dict(lambda x: to_class(TimeSpan, x), x), from_none], self.timing)
-        return result
-
-
-def build_event_data_from_dict(s: Any) -> BuildEventData:
-    return BuildEventData.from_dict(s)
-
-
-def build_event_data_to_dict(x: BuildEventData) -> Any:
-    return to_class(BuildEventData, x)
diff --git a/src/google/events/cloud/firestore/v1/DocumentEventData.py b/src/google/events/cloud/firestore/v1/DocumentEventData.py
index 45ad97f..ebdd710 100644
--- a/src/google/events/cloud/firestore/v1/DocumentEventData.py
+++ b/src/google/events/cloud/firestore/v1/DocumentEventData.py
@@ -11,86 +11,20 @@
 # 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 code parses date/times, so please
-#
-#     pip install python-dateutil
-#
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = document_event_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Any, Union, Dict, List, TypeVar, Type, cast, Callable
+from typing import Optional, Union, Dict, List
+from enum import Enum
 from datetime import datetime
-import dateutil.parser
-
-
-T = TypeVar("T")
-
-
-def from_float(x: Any) -> float:
-    assert isinstance(x, (float, int)) and not isinstance(x, bool)
-    return float(x)
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def to_float(x: Any) -> float:
-    assert isinstance(x, float)
-    return x
-
-
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
-    return x
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
-
-
-def from_datetime(x: Any) -> datetime:
-    return dateutil.parser.parse(x)
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
-    assert isinstance(x, list)
-    return [f(y) for y in x]
 
 
 class GeoPointValue:
-    """A geo point value representing a point on the surface of Earth."""
+    """A geo point value representing a point on the surface of Earth.
+    
+    An object representing a latitude/longitude pair. This is expressed as a pair
+    of doubles representing degrees latitude and degrees longitude. Unless
+    specified otherwise, this must conform to the
+    <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
+    standard</a>. Values must be within normalized ranges.
+    """
     """The latitude in degrees. It must be in the range [-90.0, +90.0]."""
     latitude: Optional[float]
     """The longitude in degrees. It must be in the range [-180.0, +180.0]."""
@@ -100,18 +34,9 @@ def __init__(self, latitude: Optional[float], longitude: Optional[float]) -> Non
         self.latitude = latitude
         self.longitude = longitude
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'GeoPointValue':
-        assert isinstance(obj, dict)
-        latitude = from_union([from_float, from_none], obj.get("latitude"))
-        longitude = from_union([from_float, from_none], obj.get("longitude"))
-        return GeoPointValue(latitude, longitude)
 
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["latitude"] = from_union([to_float, from_none], self.latitude)
-        result["longitude"] = from_union([to_float, from_none], self.longitude)
-        return result
+class BytesValue(Enum):
+    NULL_VALUE = "NULL_VALUE"
 
 
 class MapValueField:
@@ -135,11 +60,11 @@ class MapValueField:
     """A geo point value representing a point on the surface of Earth."""
     geo_point_value: Optional[GeoPointValue]
     """An integer value."""
-    integer_value: Optional[str]
+    integer_value: Optional[int]
     """A map value."""
     map_value: Optional['MapValue']
     """A null value."""
-    null_value: Union[int, None, str]
+    null_value: Union[BytesValue, int, None]
     """A reference to a document. For example:
     `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
     """
@@ -158,7 +83,7 @@ class MapValueField:
     """
     timestamp_value: Optional[datetime]
 
-    def __init__(self, array_value: Optional['ArrayValue'], boolean_value: Optional[bool], bytes_value: Optional[str], double_value: Optional[float], geo_point_value: Optional[GeoPointValue], integer_value: Optional[str], map_value: Optional['MapValue'], null_value: Union[int, None, str], reference_value: Optional[str], string_value: Optional[str], timestamp_value: Optional[datetime]) -> None:
+    def __init__(self, array_value: Optional['ArrayValue'], boolean_value: Optional[bool], bytes_value: Optional[str], double_value: Optional[float], geo_point_value: Optional[GeoPointValue], integer_value: Optional[int], map_value: Optional['MapValue'], null_value: Union[BytesValue, int, None], reference_value: Optional[str], string_value: Optional[str], timestamp_value: Optional[datetime]) -> None:
         self.array_value = array_value
         self.boolean_value = boolean_value
         self.bytes_value = bytes_value
@@ -171,37 +96,6 @@ def __init__(self, array_value: Optional['ArrayValue'], boolean_value: Optional[
         self.string_value = string_value
         self.timestamp_value = timestamp_value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'MapValueField':
-        assert isinstance(obj, dict)
-        array_value = from_union([ArrayValue.from_dict, from_none], obj.get("arrayValue"))
-        boolean_value = from_union([from_bool, from_none], obj.get("booleanValue"))
-        bytes_value = from_union([from_str, from_none], obj.get("bytesValue"))
-        double_value = from_union([from_float, from_none], obj.get("doubleValue"))
-        geo_point_value = from_union([GeoPointValue.from_dict, from_none], obj.get("geoPointValue"))
-        integer_value = from_union([from_str, from_none], obj.get("integerValue"))
-        map_value = from_union([MapValue.from_dict, from_none], obj.get("mapValue"))
-        null_value = from_union([from_int, from_str, from_none], obj.get("nullValue"))
-        reference_value = from_union([from_str, from_none], obj.get("referenceValue"))
-        string_value = from_union([from_str, from_none], obj.get("stringValue"))
-        timestamp_value = from_union([from_datetime, from_none], obj.get("timestampValue"))
-        return MapValueField(array_value, boolean_value, bytes_value, double_value, geo_point_value, integer_value, map_value, null_value, reference_value, string_value, timestamp_value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["arrayValue"] = from_union([lambda x: to_class(ArrayValue, x), from_none], self.array_value)
-        result["booleanValue"] = from_union([from_bool, from_none], self.boolean_value)
-        result["bytesValue"] = from_union([from_str, from_none], self.bytes_value)
-        result["doubleValue"] = from_union([to_float, from_none], self.double_value)
-        result["geoPointValue"] = from_union([lambda x: to_class(GeoPointValue, x), from_none], self.geo_point_value)
-        result["integerValue"] = from_union([from_str, from_none], self.integer_value)
-        result["mapValue"] = from_union([lambda x: to_class(MapValue, x), from_none], self.map_value)
-        result["nullValue"] = from_union([from_int, from_str, from_none], self.null_value)
-        result["referenceValue"] = from_union([from_str, from_none], self.reference_value)
-        result["stringValue"] = from_union([from_str, from_none], self.string_value)
-        result["timestampValue"] = from_union([lambda x: x.isoformat(), from_none], self.timestamp_value)
-        return result
-
 
 class MapValue:
     """A map value."""
@@ -217,17 +111,6 @@ class MapValue:
     def __init__(self, fields: Optional[Dict[str, MapValueField]]) -> None:
         self.fields = fields
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'MapValue':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(MapValueField.from_dict, x), from_none], obj.get("fields"))
-        return MapValue(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: to_class(MapValueField, x), x), from_none], self.fields)
-        return result
-
 
 class ValueElement:
     """A message that can hold any of the supported value types."""
@@ -250,11 +133,11 @@ class ValueElement:
     """A geo point value representing a point on the surface of Earth."""
     geo_point_value: Optional[GeoPointValue]
     """An integer value."""
-    integer_value: Optional[str]
+    integer_value: Optional[int]
     """A map value."""
     map_value: Optional[MapValue]
     """A null value."""
-    null_value: Union[int, None, str]
+    null_value: Union[BytesValue, int, None]
     """A reference to a document. For example:
     `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
     """
@@ -273,7 +156,7 @@ class ValueElement:
     """
     timestamp_value: Optional[datetime]
 
-    def __init__(self, array_value: Optional['ArrayValue'], boolean_value: Optional[bool], bytes_value: Optional[str], double_value: Optional[float], geo_point_value: Optional[GeoPointValue], integer_value: Optional[str], map_value: Optional[MapValue], null_value: Union[int, None, str], reference_value: Optional[str], string_value: Optional[str], timestamp_value: Optional[datetime]) -> None:
+    def __init__(self, array_value: Optional['ArrayValue'], boolean_value: Optional[bool], bytes_value: Optional[str], double_value: Optional[float], geo_point_value: Optional[GeoPointValue], integer_value: Optional[int], map_value: Optional[MapValue], null_value: Union[BytesValue, int, None], reference_value: Optional[str], string_value: Optional[str], timestamp_value: Optional[datetime]) -> None:
         self.array_value = array_value
         self.boolean_value = boolean_value
         self.bytes_value = bytes_value
@@ -286,43 +169,14 @@ def __init__(self, array_value: Optional['ArrayValue'], boolean_value: Optional[
         self.string_value = string_value
         self.timestamp_value = timestamp_value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ValueElement':
-        assert isinstance(obj, dict)
-        array_value = from_union([ArrayValue.from_dict, from_none], obj.get("arrayValue"))
-        boolean_value = from_union([from_bool, from_none], obj.get("booleanValue"))
-        bytes_value = from_union([from_str, from_none], obj.get("bytesValue"))
-        double_value = from_union([from_float, from_none], obj.get("doubleValue"))
-        geo_point_value = from_union([GeoPointValue.from_dict, from_none], obj.get("geoPointValue"))
-        integer_value = from_union([from_str, from_none], obj.get("integerValue"))
-        map_value = from_union([MapValue.from_dict, from_none], obj.get("mapValue"))
-        null_value = from_union([from_int, from_str, from_none], obj.get("nullValue"))
-        reference_value = from_union([from_str, from_none], obj.get("referenceValue"))
-        string_value = from_union([from_str, from_none], obj.get("stringValue"))
-        timestamp_value = from_union([from_datetime, from_none], obj.get("timestampValue"))
-        return ValueElement(array_value, boolean_value, bytes_value, double_value, geo_point_value, integer_value, map_value, null_value, reference_value, string_value, timestamp_value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["arrayValue"] = from_union([lambda x: to_class(ArrayValue, x), from_none], self.array_value)
-        result["booleanValue"] = from_union([from_bool, from_none], self.boolean_value)
-        result["bytesValue"] = from_union([from_str, from_none], self.bytes_value)
-        result["doubleValue"] = from_union([to_float, from_none], self.double_value)
-        result["geoPointValue"] = from_union([lambda x: to_class(GeoPointValue, x), from_none], self.geo_point_value)
-        result["integerValue"] = from_union([from_str, from_none], self.integer_value)
-        result["mapValue"] = from_union([lambda x: to_class(MapValue, x), from_none], self.map_value)
-        result["nullValue"] = from_union([from_int, from_str, from_none], self.null_value)
-        result["referenceValue"] = from_union([from_str, from_none], self.reference_value)
-        result["stringValue"] = from_union([from_str, from_none], self.string_value)
-        result["timestampValue"] = from_union([lambda x: x.isoformat(), from_none], self.timestamp_value)
-        return result
-
 
 class ArrayValue:
     """An array value.
     
     Cannot directly contain another array value, though can contain an
     map which contains another array.
+    
+    An array value.
     """
     """Values in the array."""
     values: Optional[List[ValueElement]]
@@ -330,17 +184,6 @@ class ArrayValue:
     def __init__(self, values: Optional[List[ValueElement]]) -> None:
         self.values = values
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ArrayValue':
-        assert isinstance(obj, dict)
-        values = from_union([lambda x: from_list(ValueElement.from_dict, x), from_none], obj.get("values"))
-        return ArrayValue(values)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["values"] = from_union([lambda x: from_list(lambda x: to_class(ValueElement, x), x), from_none], self.values)
-        return result
-
 
 class OldValueField:
     """A message that can hold any of the supported value types."""
@@ -363,11 +206,11 @@ class OldValueField:
     """A geo point value representing a point on the surface of Earth."""
     geo_point_value: Optional[GeoPointValue]
     """An integer value."""
-    integer_value: Optional[str]
+    integer_value: Optional[int]
     """A map value."""
     map_value: Optional[MapValue]
     """A null value."""
-    null_value: Union[int, None, str]
+    null_value: Union[BytesValue, int, None]
     """A reference to a document. For example:
     `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
     """
@@ -386,7 +229,7 @@ class OldValueField:
     """
     timestamp_value: Optional[datetime]
 
-    def __init__(self, array_value: Optional[ArrayValue], boolean_value: Optional[bool], bytes_value: Optional[str], double_value: Optional[float], geo_point_value: Optional[GeoPointValue], integer_value: Optional[str], map_value: Optional[MapValue], null_value: Union[int, None, str], reference_value: Optional[str], string_value: Optional[str], timestamp_value: Optional[datetime]) -> None:
+    def __init__(self, array_value: Optional[ArrayValue], boolean_value: Optional[bool], bytes_value: Optional[str], double_value: Optional[float], geo_point_value: Optional[GeoPointValue], integer_value: Optional[int], map_value: Optional[MapValue], null_value: Union[BytesValue, int, None], reference_value: Optional[str], string_value: Optional[str], timestamp_value: Optional[datetime]) -> None:
         self.array_value = array_value
         self.boolean_value = boolean_value
         self.bytes_value = bytes_value
@@ -399,37 +242,6 @@ def __init__(self, array_value: Optional[ArrayValue], boolean_value: Optional[bo
         self.string_value = string_value
         self.timestamp_value = timestamp_value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'OldValueField':
-        assert isinstance(obj, dict)
-        array_value = from_union([ArrayValue.from_dict, from_none], obj.get("arrayValue"))
-        boolean_value = from_union([from_bool, from_none], obj.get("booleanValue"))
-        bytes_value = from_union([from_str, from_none], obj.get("bytesValue"))
-        double_value = from_union([from_float, from_none], obj.get("doubleValue"))
-        geo_point_value = from_union([GeoPointValue.from_dict, from_none], obj.get("geoPointValue"))
-        integer_value = from_union([from_str, from_none], obj.get("integerValue"))
-        map_value = from_union([MapValue.from_dict, from_none], obj.get("mapValue"))
-        null_value = from_union([from_int, from_str, from_none], obj.get("nullValue"))
-        reference_value = from_union([from_str, from_none], obj.get("referenceValue"))
-        string_value = from_union([from_str, from_none], obj.get("stringValue"))
-        timestamp_value = from_union([from_datetime, from_none], obj.get("timestampValue"))
-        return OldValueField(array_value, boolean_value, bytes_value, double_value, geo_point_value, integer_value, map_value, null_value, reference_value, string_value, timestamp_value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["arrayValue"] = from_union([lambda x: to_class(ArrayValue, x), from_none], self.array_value)
-        result["booleanValue"] = from_union([from_bool, from_none], self.boolean_value)
-        result["bytesValue"] = from_union([from_str, from_none], self.bytes_value)
-        result["doubleValue"] = from_union([to_float, from_none], self.double_value)
-        result["geoPointValue"] = from_union([lambda x: to_class(GeoPointValue, x), from_none], self.geo_point_value)
-        result["integerValue"] = from_union([from_str, from_none], self.integer_value)
-        result["mapValue"] = from_union([lambda x: to_class(MapValue, x), from_none], self.map_value)
-        result["nullValue"] = from_union([from_int, from_str, from_none], self.null_value)
-        result["referenceValue"] = from_union([from_str, from_none], self.reference_value)
-        result["stringValue"] = from_union([from_str, from_none], self.string_value)
-        result["timestampValue"] = from_union([lambda x: x.isoformat(), from_none], self.timestamp_value)
-        return result
-
 
 class OldValue:
     """A Document object containing a pre-operation document snapshot.
@@ -470,8 +282,8 @@ class OldValue:
     `` `bak\`tik` `` represents `` bak`tik ``.
     """
     fields: Optional[Dict[str, OldValueField]]
-    """The resource name of the document, for example
-    `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+    """The resource name of the document. For example:
+    `projects/{project_id}/databases/{database_id}/documents/{document_path}`
     """
     name: Optional[str]
     """The time at which the document was last changed.
@@ -488,27 +300,12 @@ def __init__(self, create_time: Optional[datetime], fields: Optional[Dict[str, O
         self.name = name
         self.update_time = update_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'OldValue':
-        assert isinstance(obj, dict)
-        create_time = from_union([from_datetime, from_none], obj.get("createTime"))
-        fields = from_union([lambda x: from_dict(OldValueField.from_dict, x), from_none], obj.get("fields"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        update_time = from_union([from_datetime, from_none], obj.get("updateTime"))
-        return OldValue(create_time, fields, name, update_time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["createTime"] = from_union([lambda x: x.isoformat(), from_none], self.create_time)
-        result["fields"] = from_union([lambda x: from_dict(lambda x: to_class(OldValueField, x), x), from_none], self.fields)
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["updateTime"] = from_union([lambda x: x.isoformat(), from_none], self.update_time)
-        return result
-
-
-class UpdateMask:
+
+class Mask:
     """A DocumentMask object that lists changed fields.
     This is only populated for update events.
+    
+    A set of field paths on a document.
     """
     """The list of field paths in the mask.
     See [Document.fields][google.cloud.firestore.v1.events.Document.fields]
@@ -519,21 +316,10 @@ class UpdateMask:
     def __init__(self, field_paths: Optional[List[str]]) -> None:
         self.field_paths = field_paths
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'UpdateMask':
-        assert isinstance(obj, dict)
-        field_paths = from_union([lambda x: from_list(from_str, x), from_none], obj.get("fieldPaths"))
-        return UpdateMask(field_paths)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fieldPaths"] = from_union([lambda x: from_list(from_str, x), from_none], self.field_paths)
-        return result
-
 
 class Value:
     """A Document object containing a post-operation document snapshot.
-    This is not populated for delete events. (TODO: check this!)
+    This is not populated for delete events.
     
     A Document object containing a pre-operation document snapshot.
     This is only populated for update and delete events.
@@ -573,8 +359,8 @@ class Value:
     `` `bak\`tik` `` represents `` bak`tik ``.
     """
     fields: Optional[Dict[str, OldValueField]]
-    """The resource name of the document, for example
-    `projects/{project_id}/databases/{database_id}/documents/{document_path}`.
+    """The resource name of the document. For example:
+    `projects/{project_id}/databases/{database_id}/documents/{document_path}`
     """
     name: Optional[str]
     """The time at which the document was last changed.
@@ -591,23 +377,6 @@ def __init__(self, create_time: Optional[datetime], fields: Optional[Dict[str, O
         self.name = name
         self.update_time = update_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Value':
-        assert isinstance(obj, dict)
-        create_time = from_union([from_datetime, from_none], obj.get("createTime"))
-        fields = from_union([lambda x: from_dict(OldValueField.from_dict, x), from_none], obj.get("fields"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        update_time = from_union([from_datetime, from_none], obj.get("updateTime"))
-        return Value(create_time, fields, name, update_time)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["createTime"] = from_union([lambda x: x.isoformat(), from_none], self.create_time)
-        result["fields"] = from_union([lambda x: from_dict(lambda x: to_class(OldValueField, x), x), from_none], self.fields)
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["updateTime"] = from_union([lambda x: x.isoformat(), from_none], self.update_time)
-        return result
-
 
 class DocumentEventData:
     """The data within all Firestore document events."""
@@ -618,36 +387,13 @@ class DocumentEventData:
     """A DocumentMask object that lists changed fields.
     This is only populated for update events.
     """
-    update_mask: Optional[UpdateMask]
+    update_mask: Optional[Mask]
     """A Document object containing a post-operation document snapshot.
-    This is not populated for delete events. (TODO: check this!)
+    This is not populated for delete events.
     """
     value: Optional[Value]
 
-    def __init__(self, old_value: Optional[OldValue], update_mask: Optional[UpdateMask], value: Optional[Value]) -> None:
+    def __init__(self, old_value: Optional[OldValue], update_mask: Optional[Mask], value: Optional[Value]) -> None:
         self.old_value = old_value
         self.update_mask = update_mask
         self.value = value
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'DocumentEventData':
-        assert isinstance(obj, dict)
-        old_value = from_union([OldValue.from_dict, from_none], obj.get("oldValue"))
-        update_mask = from_union([UpdateMask.from_dict, from_none], obj.get("updateMask"))
-        value = from_union([Value.from_dict, from_none], obj.get("value"))
-        return DocumentEventData(old_value, update_mask, value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["oldValue"] = from_union([lambda x: to_class(OldValue, x), from_none], self.old_value)
-        result["updateMask"] = from_union([lambda x: to_class(UpdateMask, x), from_none], self.update_mask)
-        result["value"] = from_union([lambda x: to_class(Value, x), from_none], self.value)
-        return result
-
-
-def document_event_data_from_dict(s: Any) -> DocumentEventData:
-    return DocumentEventData.from_dict(s)
-
-
-def document_event_data_to_dict(x: DocumentEventData) -> Any:
-    return to_class(DocumentEventData, x)
diff --git a/src/google/events/cloud/pubsub/v1/MessagePublishedData.py b/src/google/events/cloud/pubsub/v1/MessagePublishedData.py
index dbc9260..da28e2b 100644
--- a/src/google/events/cloud/pubsub/v1/MessagePublishedData.py
+++ b/src/google/events/cloud/pubsub/v1/MessagePublishedData.py
@@ -11,51 +11,15 @@
 # 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.
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = message_published_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Dict, Any, TypeVar, Callable, Type, cast
-
-
-T = TypeVar("T")
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
+from typing import Optional, Dict
+from datetime import datetime
 
 
 class Message:
-    """The message that was published."""
+    """The message that was published.
+    
+    A message published to a topic.
+    """
     """Attributes for this message."""
     attributes: Optional[Dict[str, str]]
     """The binary data in the message."""
@@ -64,26 +28,21 @@ class Message:
     Guaranteed to be unique within the topic.
     """
     message_id: Optional[str]
+    """If non-empty, identifies related messages for which publish order should be
+    respected.
+    """
+    ordering_key: Optional[str]
+    """The time at which the message was published, populated by the server when
+    it receives the `Publish` call.
+    """
+    publish_time: Optional[datetime]
 
-    def __init__(self, attributes: Optional[Dict[str, str]], data: Optional[str], message_id: Optional[str]) -> None:
+    def __init__(self, attributes: Optional[Dict[str, str]], data: Optional[str], message_id: Optional[str], ordering_key: Optional[str], publish_time: Optional[datetime]) -> None:
         self.attributes = attributes
         self.data = data
         self.message_id = message_id
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'Message':
-        assert isinstance(obj, dict)
-        attributes = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("attributes"))
-        data = from_union([from_str, from_none], obj.get("data"))
-        message_id = from_union([from_str, from_none], obj.get("messageId"))
-        return Message(attributes, data, message_id)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["attributes"] = from_union([lambda x: from_dict(from_str, x), from_none], self.attributes)
-        result["data"] = from_union([from_str, from_none], self.data)
-        result["messageId"] = from_union([from_str, from_none], self.message_id)
-        return result
+        self.ordering_key = ordering_key
+        self.publish_time = publish_time
 
 
 class MessagePublishedData:
@@ -99,24 +58,3 @@ class MessagePublishedData:
     def __init__(self, message: Optional[Message], subscription: Optional[str]) -> None:
         self.message = message
         self.subscription = subscription
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'MessagePublishedData':
-        assert isinstance(obj, dict)
-        message = from_union([Message.from_dict, from_none], obj.get("message"))
-        subscription = from_union([from_str, from_none], obj.get("subscription"))
-        return MessagePublishedData(message, subscription)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["message"] = from_union([lambda x: to_class(Message, x), from_none], self.message)
-        result["subscription"] = from_union([from_str, from_none], self.subscription)
-        return result
-
-
-def message_published_data_from_dict(s: Any) -> MessagePublishedData:
-    return MessagePublishedData.from_dict(s)
-
-
-def message_published_data_to_dict(x: MessagePublishedData) -> Any:
-    return to_class(MessagePublishedData, x)
diff --git a/src/google/events/cloud/scheduler/v1/SchedulerJobData.py b/src/google/events/cloud/scheduler/v1/SchedulerJobData.py
index 04716fc..df4daef 100644
--- a/src/google/events/cloud/scheduler/v1/SchedulerJobData.py
+++ b/src/google/events/cloud/scheduler/v1/SchedulerJobData.py
@@ -11,42 +11,7 @@
 # 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.
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = scheduler_job_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Any, TypeVar, Type, cast
-
-
-T = TypeVar("T")
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
+from typing import Optional
 
 
 class SchedulerJobData:
@@ -56,22 +21,3 @@ class SchedulerJobData:
 
     def __init__(self, custom_data: Optional[str]) -> None:
         self.custom_data = custom_data
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'SchedulerJobData':
-        assert isinstance(obj, dict)
-        custom_data = from_union([from_str, from_none], obj.get("customData"))
-        return SchedulerJobData(custom_data)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["customData"] = from_union([from_str, from_none], self.custom_data)
-        return result
-
-
-def scheduler_job_data_from_dict(s: Any) -> SchedulerJobData:
-    return SchedulerJobData.from_dict(s)
-
-
-def scheduler_job_data_to_dict(x: SchedulerJobData) -> Any:
-    return to_class(SchedulerJobData, x)
diff --git a/src/google/events/cloud/storage/v1/StorageObjectData.py b/src/google/events/cloud/storage/v1/StorageObjectData.py
index 3a50f90..f0c9f46 100644
--- a/src/google/events/cloud/storage/v1/StorageObjectData.py
+++ b/src/google/events/cloud/storage/v1/StorageObjectData.py
@@ -11,72 +11,15 @@
 # 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 code parses date/times, so please
-#
-#     pip install python-dateutil
-#
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = storage_object_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Any, Dict, TypeVar, Callable, Type, cast
+from typing import Optional, Dict
 from datetime import datetime
-import dateutil.parser
-
-
-T = TypeVar("T")
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
-
-
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
-    return x
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def from_datetime(x: Any) -> datetime:
-    return dateutil.parser.parse(x)
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
 
 
 class CustomerEncryption:
     """Metadata of customer-supplied encryption key, if the object is encrypted by
     such a key.
+    
+    Describes the customer-specified mechanism used to store the data at rest.
     """
     """The encryption algorithm."""
     encryption_algorithm: Optional[str]
@@ -87,19 +30,6 @@ def __init__(self, encryption_algorithm: Optional[str], key_sha256: Optional[str
         self.encryption_algorithm = encryption_algorithm
         self.key_sha256 = key_sha256
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'CustomerEncryption':
-        assert isinstance(obj, dict)
-        encryption_algorithm = from_union([from_str, from_none], obj.get("encryptionAlgorithm"))
-        key_sha256 = from_union([from_str, from_none], obj.get("keySha256"))
-        return CustomerEncryption(encryption_algorithm, key_sha256)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["encryptionAlgorithm"] = from_union([from_str, from_none], self.encryption_algorithm)
-        result["keySha256"] = from_union([from_str, from_none], self.key_sha256)
-        return result
-
 
 class StorageObjectData:
     """An object within Google Cloud Storage."""
@@ -151,7 +81,7 @@ class StorageObjectData:
     """The content generation of this object. Used for object versioning.
     Attempting to set this field will result in an error.
     """
-    generation: Optional[str]
+    generation: Optional[int]
     """The ID of the object, including the bucket name, object name, and
     generation number.
     """
@@ -178,7 +108,7 @@ class StorageObjectData:
     number is only meaningful in the context of a particular generation of a
     particular object.
     """
-    metageneration: Optional[str]
+    metageneration: Optional[int]
     """The name of the object."""
     name: Optional[str]
     """A server-determined value that specifies the earliest time that the
@@ -190,7 +120,7 @@ class StorageObjectData:
     """Content-Length of the object data in bytes, matching
     [https://tools.ietf.org/html/rfc7230#section-3.3.2][RFC 7230 §3.3.2].
     """
-    size: Optional[str]
+    size: Optional[int]
     """Storage class of the object."""
     storage_class: Optional[str]
     """Whether an object is under temporary hold."""
@@ -208,7 +138,7 @@ class StorageObjectData:
     """The modification time of the object metadata."""
     updated: Optional[datetime]
 
-    def __init__(self, bucket: Optional[str], cache_control: Optional[str], component_count: Optional[int], content_disposition: Optional[str], content_encoding: Optional[str], content_language: Optional[str], content_type: Optional[str], crc32_c: Optional[str], customer_encryption: Optional[CustomerEncryption], etag: Optional[str], event_based_hold: Optional[bool], generation: Optional[str], id: Optional[str], kind: Optional[str], kms_key_name: Optional[str], md5_hash: Optional[str], media_link: Optional[str], metadata: Optional[Dict[str, str]], metageneration: Optional[str], name: Optional[str], retention_expiration_time: Optional[datetime], self_link: Optional[str], size: Optional[str], storage_class: Optional[str], temporary_hold: Optional[bool], time_created: Optional[datetime], time_deleted: Optional[datetime], time_storage_class_updated: Optional[datetime], updated: Optional[datetime]) -> None:
+    def __init__(self, bucket: Optional[str], cache_control: Optional[str], component_count: Optional[int], content_disposition: Optional[str], content_encoding: Optional[str], content_language: Optional[str], content_type: Optional[str], crc32_c: Optional[str], customer_encryption: Optional[CustomerEncryption], etag: Optional[str], event_based_hold: Optional[bool], generation: Optional[int], id: Optional[str], kind: Optional[str], kms_key_name: Optional[str], md5_hash: Optional[str], media_link: Optional[str], metadata: Optional[Dict[str, str]], metageneration: Optional[int], name: Optional[str], retention_expiration_time: Optional[datetime], self_link: Optional[str], size: Optional[int], storage_class: Optional[str], temporary_hold: Optional[bool], time_created: Optional[datetime], time_deleted: Optional[datetime], time_storage_class_updated: Optional[datetime], updated: Optional[datetime]) -> None:
         self.bucket = bucket
         self.cache_control = cache_control
         self.component_count = component_count
@@ -238,78 +168,3 @@ def __init__(self, bucket: Optional[str], cache_control: Optional[str], componen
         self.time_deleted = time_deleted
         self.time_storage_class_updated = time_storage_class_updated
         self.updated = updated
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'StorageObjectData':
-        assert isinstance(obj, dict)
-        bucket = from_union([from_str, from_none], obj.get("bucket"))
-        cache_control = from_union([from_str, from_none], obj.get("cacheControl"))
-        component_count = from_union([from_int, from_none], obj.get("componentCount"))
-        content_disposition = from_union([from_str, from_none], obj.get("contentDisposition"))
-        content_encoding = from_union([from_str, from_none], obj.get("contentEncoding"))
-        content_language = from_union([from_str, from_none], obj.get("contentLanguage"))
-        content_type = from_union([from_str, from_none], obj.get("contentType"))
-        crc32_c = from_union([from_str, from_none], obj.get("crc32C"))
-        customer_encryption = from_union([CustomerEncryption.from_dict, from_none], obj.get("customerEncryption"))
-        etag = from_union([from_str, from_none], obj.get("etag"))
-        event_based_hold = from_union([from_bool, from_none], obj.get("eventBasedHold"))
-        generation = from_union([from_str, from_none], obj.get("generation"))
-        id = from_union([from_str, from_none], obj.get("id"))
-        kind = from_union([from_str, from_none], obj.get("kind"))
-        kms_key_name = from_union([from_str, from_none], obj.get("kmsKeyName"))
-        md5_hash = from_union([from_str, from_none], obj.get("md5Hash"))
-        media_link = from_union([from_str, from_none], obj.get("mediaLink"))
-        metadata = from_union([lambda x: from_dict(from_str, x), from_none], obj.get("metadata"))
-        metageneration = from_union([from_str, from_none], obj.get("metageneration"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        retention_expiration_time = from_union([from_datetime, from_none], obj.get("retentionExpirationTime"))
-        self_link = from_union([from_str, from_none], obj.get("selfLink"))
-        size = from_union([from_str, from_none], obj.get("size"))
-        storage_class = from_union([from_str, from_none], obj.get("storageClass"))
-        temporary_hold = from_union([from_bool, from_none], obj.get("temporaryHold"))
-        time_created = from_union([from_datetime, from_none], obj.get("timeCreated"))
-        time_deleted = from_union([from_datetime, from_none], obj.get("timeDeleted"))
-        time_storage_class_updated = from_union([from_datetime, from_none], obj.get("timeStorageClassUpdated"))
-        updated = from_union([from_datetime, from_none], obj.get("updated"))
-        return StorageObjectData(bucket, cache_control, component_count, content_disposition, content_encoding, content_language, content_type, crc32_c, customer_encryption, etag, event_based_hold, generation, id, kind, kms_key_name, md5_hash, media_link, metadata, metageneration, name, retention_expiration_time, self_link, size, storage_class, temporary_hold, time_created, time_deleted, time_storage_class_updated, updated)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["bucket"] = from_union([from_str, from_none], self.bucket)
-        result["cacheControl"] = from_union([from_str, from_none], self.cache_control)
-        result["componentCount"] = from_union([from_int, from_none], self.component_count)
-        result["contentDisposition"] = from_union([from_str, from_none], self.content_disposition)
-        result["contentEncoding"] = from_union([from_str, from_none], self.content_encoding)
-        result["contentLanguage"] = from_union([from_str, from_none], self.content_language)
-        result["contentType"] = from_union([from_str, from_none], self.content_type)
-        result["crc32C"] = from_union([from_str, from_none], self.crc32_c)
-        result["customerEncryption"] = from_union([lambda x: to_class(CustomerEncryption, x), from_none], self.customer_encryption)
-        result["etag"] = from_union([from_str, from_none], self.etag)
-        result["eventBasedHold"] = from_union([from_bool, from_none], self.event_based_hold)
-        result["generation"] = from_union([from_str, from_none], self.generation)
-        result["id"] = from_union([from_str, from_none], self.id)
-        result["kind"] = from_union([from_str, from_none], self.kind)
-        result["kmsKeyName"] = from_union([from_str, from_none], self.kms_key_name)
-        result["md5Hash"] = from_union([from_str, from_none], self.md5_hash)
-        result["mediaLink"] = from_union([from_str, from_none], self.media_link)
-        result["metadata"] = from_union([lambda x: from_dict(from_str, x), from_none], self.metadata)
-        result["metageneration"] = from_union([from_str, from_none], self.metageneration)
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["retentionExpirationTime"] = from_union([lambda x: x.isoformat(), from_none], self.retention_expiration_time)
-        result["selfLink"] = from_union([from_str, from_none], self.self_link)
-        result["size"] = from_union([from_str, from_none], self.size)
-        result["storageClass"] = from_union([from_str, from_none], self.storage_class)
-        result["temporaryHold"] = from_union([from_bool, from_none], self.temporary_hold)
-        result["timeCreated"] = from_union([lambda x: x.isoformat(), from_none], self.time_created)
-        result["timeDeleted"] = from_union([lambda x: x.isoformat(), from_none], self.time_deleted)
-        result["timeStorageClassUpdated"] = from_union([lambda x: x.isoformat(), from_none], self.time_storage_class_updated)
-        result["updated"] = from_union([lambda x: x.isoformat(), from_none], self.updated)
-        return result
-
-
-def storage_object_data_from_dict(s: Any) -> StorageObjectData:
-    return StorageObjectData.from_dict(s)
-
-
-def storage_object_data_to_dict(x: StorageObjectData) -> Any:
-    return to_class(StorageObjectData, x)
diff --git a/src/google/events/firebase/analytics/v1/AnalyticsLogData.py b/src/google/events/firebase/analytics/v1/AnalyticsLogData.py
index f801891..c88c985 100644
--- a/src/google/events/firebase/analytics/v1/AnalyticsLogData.py
+++ b/src/google/events/firebase/analytics/v1/AnalyticsLogData.py
@@ -11,72 +11,7 @@
 # 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.
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = analytics_log_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Any, Dict, List, TypeVar, Callable, Type, cast
-
-
-T = TypeVar("T")
-
-
-def from_float(x: Any) -> float:
-    assert isinstance(x, (float, int)) and not isinstance(x, bool)
-    return float(x)
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def to_float(x: Any) -> float:
-    assert isinstance(x, float)
-    return x
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
-
-
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
-
-
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
-    return x
-
-
-def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
-    assert isinstance(x, list)
-    return [f(y) for y in x]
+from typing import Optional, Dict, List
 
 
 class AnalyticsValue:
@@ -85,34 +20,17 @@ class AnalyticsValue:
     """
     double_value: Optional[float]
     float_value: Optional[float]
-    int_value: Optional[str]
+    int_value: Optional[int]
     string_value: Optional[str]
 
-    def __init__(self, double_value: Optional[float], float_value: Optional[float], int_value: Optional[str], string_value: Optional[str]) -> None:
+    def __init__(self, double_value: Optional[float], float_value: Optional[float], int_value: Optional[int], string_value: Optional[str]) -> None:
         self.double_value = double_value
         self.float_value = float_value
         self.int_value = int_value
         self.string_value = string_value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'AnalyticsValue':
-        assert isinstance(obj, dict)
-        double_value = from_union([from_float, from_none], obj.get("doubleValue"))
-        float_value = from_union([from_float, from_none], obj.get("floatValue"))
-        int_value = from_union([from_str, from_none], obj.get("intValue"))
-        string_value = from_union([from_str, from_none], obj.get("stringValue"))
-        return AnalyticsValue(double_value, float_value, int_value, string_value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["doubleValue"] = from_union([to_float, from_none], self.double_value)
-        result["floatValue"] = from_union([to_float, from_none], self.float_value)
-        result["intValue"] = from_union([from_str, from_none], self.int_value)
-        result["stringValue"] = from_union([from_str, from_none], self.string_value)
-        return result
-
-
-class EventDim:
+
+class EventDimensions:
     """Message containing information pertaining to the event."""
     """The date on which this event was logged.
     (YYYYMMDD format in the registered timezone of your app.)
@@ -123,13 +41,13 @@ class EventDim:
     """A repeated record of the parameters associated with this event."""
     params: Optional[Dict[str, AnalyticsValue]]
     """UTC client time when the previous event happened."""
-    previous_timestamp_micros: Optional[str]
+    previous_timestamp_micros: Optional[int]
     """UTC client time when the event happened."""
-    timestamp_micros: Optional[str]
+    timestamp_micros: Optional[int]
     """Value param in USD."""
     value_in_usd: Optional[float]
 
-    def __init__(self, date: Optional[str], name: Optional[str], params: Optional[Dict[str, AnalyticsValue]], previous_timestamp_micros: Optional[str], timestamp_micros: Optional[str], value_in_usd: Optional[float]) -> None:
+    def __init__(self, date: Optional[str], name: Optional[str], params: Optional[Dict[str, AnalyticsValue]], previous_timestamp_micros: Optional[int], timestamp_micros: Optional[int], value_in_usd: Optional[float]) -> None:
         self.date = date
         self.name = name
         self.params = params
@@ -137,30 +55,12 @@ def __init__(self, date: Optional[str], name: Optional[str], params: Optional[Di
         self.timestamp_micros = timestamp_micros
         self.value_in_usd = value_in_usd
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'EventDim':
-        assert isinstance(obj, dict)
-        date = from_union([from_str, from_none], obj.get("date"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        params = from_union([lambda x: from_dict(AnalyticsValue.from_dict, x), from_none], obj.get("params"))
-        previous_timestamp_micros = from_union([from_str, from_none], obj.get("previousTimestampMicros"))
-        timestamp_micros = from_union([from_str, from_none], obj.get("timestampMicros"))
-        value_in_usd = from_union([from_float, from_none], obj.get("valueInUsd"))
-        return EventDim(date, name, params, previous_timestamp_micros, timestamp_micros, value_in_usd)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["date"] = from_union([from_str, from_none], self.date)
-        result["name"] = from_union([from_str, from_none], self.name)
-        result["params"] = from_union([lambda x: from_dict(lambda x: to_class(AnalyticsValue, x), x), from_none], self.params)
-        result["previousTimestampMicros"] = from_union([from_str, from_none], self.previous_timestamp_micros)
-        result["timestampMicros"] = from_union([from_str, from_none], self.timestamp_micros)
-        result["valueInUsd"] = from_union([to_float, from_none], self.value_in_usd)
-        return result
-
 
 class AppInfo:
-    """App information."""
+    """App information.
+    
+    Message which contains App Information.
+    """
     """Unique application identifier within an app store."""
     app_id: Optional[str]
     """Unique id for this instance of the app.
@@ -188,53 +88,28 @@ def __init__(self, app_id: Optional[str], app_instance_id: Optional[str], app_pl
         self.app_store = app_store
         self.app_version = app_version
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'AppInfo':
-        assert isinstance(obj, dict)
-        app_id = from_union([from_str, from_none], obj.get("appId"))
-        app_instance_id = from_union([from_str, from_none], obj.get("appInstanceId"))
-        app_platform = from_union([from_str, from_none], obj.get("appPlatform"))
-        app_store = from_union([from_str, from_none], obj.get("appStore"))
-        app_version = from_union([from_str, from_none], obj.get("appVersion"))
-        return AppInfo(app_id, app_instance_id, app_platform, app_store, app_version)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["appId"] = from_union([from_str, from_none], self.app_id)
-        result["appInstanceId"] = from_union([from_str, from_none], self.app_instance_id)
-        result["appPlatform"] = from_union([from_str, from_none], self.app_platform)
-        result["appStore"] = from_union([from_str, from_none], self.app_store)
-        result["appVersion"] = from_union([from_str, from_none], self.app_version)
-        return result
-
 
 class BundleInfo:
-    """Information regarding the bundle in which these events were uploaded."""
+    """Information regarding the bundle in which these events were uploaded.
+    
+    Message containing information regarding the bundle in which these
+    events were uploaded.
+    """
     """Monotonically increasing index for each bundle set by SDK."""
     bundle_sequence_id: Optional[int]
     """Timestamp offset between collection time and upload time."""
-    server_timestamp_offset_micros: Optional[str]
+    server_timestamp_offset_micros: Optional[int]
 
-    def __init__(self, bundle_sequence_id: Optional[int], server_timestamp_offset_micros: Optional[str]) -> None:
+    def __init__(self, bundle_sequence_id: Optional[int], server_timestamp_offset_micros: Optional[int]) -> None:
         self.bundle_sequence_id = bundle_sequence_id
         self.server_timestamp_offset_micros = server_timestamp_offset_micros
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'BundleInfo':
-        assert isinstance(obj, dict)
-        bundle_sequence_id = from_union([from_int, from_none], obj.get("bundleSequenceId"))
-        server_timestamp_offset_micros = from_union([from_str, from_none], obj.get("serverTimestampOffsetMicros"))
-        return BundleInfo(bundle_sequence_id, server_timestamp_offset_micros)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["bundleSequenceId"] = from_union([from_int, from_none], self.bundle_sequence_id)
-        result["serverTimestampOffsetMicros"] = from_union([from_str, from_none], self.server_timestamp_offset_micros)
-        return result
-
 
 class DeviceInfo:
-    """Device information."""
+    """Device information.
+    
+    Message containing device informations.
+    """
     """Device category.
     Eg. tablet or mobile.
     """
@@ -295,40 +170,12 @@ def __init__(self, device_category: Optional[str], device_id: Optional[str], dev
         self.resettable_device_id = resettable_device_id
         self.user_default_language = user_default_language
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'DeviceInfo':
-        assert isinstance(obj, dict)
-        device_category = from_union([from_str, from_none], obj.get("deviceCategory"))
-        device_id = from_union([from_str, from_none], obj.get("deviceId"))
-        device_model = from_union([from_str, from_none], obj.get("deviceModel"))
-        device_time_zone_offset_seconds = from_union([from_int, from_none], obj.get("deviceTimeZoneOffsetSeconds"))
-        limited_ad_tracking = from_union([from_bool, from_none], obj.get("limitedAdTracking"))
-        mobile_brand_name = from_union([from_str, from_none], obj.get("mobileBrandName"))
-        mobile_marketing_name = from_union([from_str, from_none], obj.get("mobileMarketingName"))
-        mobile_model_name = from_union([from_str, from_none], obj.get("mobileModelName"))
-        platform_version = from_union([from_str, from_none], obj.get("platformVersion"))
-        resettable_device_id = from_union([from_str, from_none], obj.get("resettableDeviceId"))
-        user_default_language = from_union([from_str, from_none], obj.get("userDefaultLanguage"))
-        return DeviceInfo(device_category, device_id, device_model, device_time_zone_offset_seconds, limited_ad_tracking, mobile_brand_name, mobile_marketing_name, mobile_model_name, platform_version, resettable_device_id, user_default_language)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["deviceCategory"] = from_union([from_str, from_none], self.device_category)
-        result["deviceId"] = from_union([from_str, from_none], self.device_id)
-        result["deviceModel"] = from_union([from_str, from_none], self.device_model)
-        result["deviceTimeZoneOffsetSeconds"] = from_union([from_int, from_none], self.device_time_zone_offset_seconds)
-        result["limitedAdTracking"] = from_union([from_bool, from_none], self.limited_ad_tracking)
-        result["mobileBrandName"] = from_union([from_str, from_none], self.mobile_brand_name)
-        result["mobileMarketingName"] = from_union([from_str, from_none], self.mobile_marketing_name)
-        result["mobileModelName"] = from_union([from_str, from_none], self.mobile_model_name)
-        result["platformVersion"] = from_union([from_str, from_none], self.platform_version)
-        result["resettableDeviceId"] = from_union([from_str, from_none], self.resettable_device_id)
-        result["userDefaultLanguage"] = from_union([from_str, from_none], self.user_default_language)
-        return result
-
 
 class GeoInfo:
-    """User's geographic information."""
+    """User's geographic information.
+    
+    User's geographic informaiton.
+    """
     """The geographic city.
     Eg. Sao Paulo
     """
@@ -352,23 +199,6 @@ def __init__(self, city: Optional[str], continent: Optional[str], country: Optio
         self.country = country
         self.region = region
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'GeoInfo':
-        assert isinstance(obj, dict)
-        city = from_union([from_str, from_none], obj.get("city"))
-        continent = from_union([from_str, from_none], obj.get("continent"))
-        country = from_union([from_str, from_none], obj.get("country"))
-        region = from_union([from_str, from_none], obj.get("region"))
-        return GeoInfo(city, continent, country, region)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["city"] = from_union([from_str, from_none], self.city)
-        result["continent"] = from_union([from_str, from_none], self.continent)
-        result["country"] = from_union([from_str, from_none], self.country)
-        result["region"] = from_union([from_str, from_none], self.region)
-        return result
-
 
 class LtvInfo:
     """Lifetime Value information about this user."""
@@ -381,22 +211,12 @@ def __init__(self, currency: Optional[str], revenue: Optional[float]) -> None:
         self.currency = currency
         self.revenue = revenue
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'LtvInfo':
-        assert isinstance(obj, dict)
-        currency = from_union([from_str, from_none], obj.get("currency"))
-        revenue = from_union([from_float, from_none], obj.get("revenue"))
-        return LtvInfo(currency, revenue)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["currency"] = from_union([from_str, from_none], self.currency)
-        result["revenue"] = from_union([to_float, from_none], self.revenue)
-        return result
-
 
 class TrafficSource:
-    """Information about marketing campaign which acquired the user."""
+    """Information about marketing campaign which acquired the user.
+    
+    Mesage containing marketing campaign information which acquired the user.
+    """
     """The name of the campaign which acquired the user."""
     user_acquired_campaign: Optional[str]
     """The name of the medium which acquired the user."""
@@ -409,21 +229,6 @@ def __init__(self, user_acquired_campaign: Optional[str], user_acquired_medium:
         self.user_acquired_medium = user_acquired_medium
         self.user_acquired_source = user_acquired_source
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'TrafficSource':
-        assert isinstance(obj, dict)
-        user_acquired_campaign = from_union([from_str, from_none], obj.get("userAcquiredCampaign"))
-        user_acquired_medium = from_union([from_str, from_none], obj.get("userAcquiredMedium"))
-        user_acquired_source = from_union([from_str, from_none], obj.get("userAcquiredSource"))
-        return TrafficSource(user_acquired_campaign, user_acquired_medium, user_acquired_source)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["userAcquiredCampaign"] = from_union([from_str, from_none], self.user_acquired_campaign)
-        result["userAcquiredMedium"] = from_union([from_str, from_none], self.user_acquired_medium)
-        result["userAcquiredSource"] = from_union([from_str, from_none], self.user_acquired_source)
-        return result
-
 
 class Value:
     """Last set value of user property.
@@ -433,64 +238,38 @@ class Value:
     """
     double_value: Optional[float]
     float_value: Optional[float]
-    int_value: Optional[str]
+    int_value: Optional[int]
     string_value: Optional[str]
 
-    def __init__(self, double_value: Optional[float], float_value: Optional[float], int_value: Optional[str], string_value: Optional[str]) -> None:
+    def __init__(self, double_value: Optional[float], float_value: Optional[float], int_value: Optional[int], string_value: Optional[str]) -> None:
         self.double_value = double_value
         self.float_value = float_value
         self.int_value = int_value
         self.string_value = string_value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Value':
-        assert isinstance(obj, dict)
-        double_value = from_union([from_float, from_none], obj.get("doubleValue"))
-        float_value = from_union([from_float, from_none], obj.get("floatValue"))
-        int_value = from_union([from_str, from_none], obj.get("intValue"))
-        string_value = from_union([from_str, from_none], obj.get("stringValue"))
-        return Value(double_value, float_value, int_value, string_value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["doubleValue"] = from_union([to_float, from_none], self.double_value)
-        result["floatValue"] = from_union([to_float, from_none], self.float_value)
-        result["intValue"] = from_union([from_str, from_none], self.int_value)
-        result["stringValue"] = from_union([from_str, from_none], self.string_value)
-        return result
-
-
-class UserProperty:
+
+class UserPropertyValue:
+    """Predefined (eg: LTV) or custom properties (eg: birthday) stored on client
+    side and associated with subsequent HitBundles.
+    """
     """Index for user property (one-based)."""
     index: Optional[int]
     """UTC client time when user property was last set."""
-    set_timestamp_usec: Optional[str]
+    set_timestamp_usec: Optional[int]
     """Last set value of user property."""
     value: Optional[Value]
 
-    def __init__(self, index: Optional[int], set_timestamp_usec: Optional[str], value: Optional[Value]) -> None:
+    def __init__(self, index: Optional[int], set_timestamp_usec: Optional[int], value: Optional[Value]) -> None:
         self.index = index
         self.set_timestamp_usec = set_timestamp_usec
         self.value = value
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'UserProperty':
-        assert isinstance(obj, dict)
-        index = from_union([from_int, from_none], obj.get("index"))
-        set_timestamp_usec = from_union([from_str, from_none], obj.get("setTimestampUsec"))
-        value = from_union([Value.from_dict, from_none], obj.get("value"))
-        return UserProperty(index, set_timestamp_usec, value)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["index"] = from_union([from_int, from_none], self.index)
-        result["setTimestampUsec"] = from_union([from_str, from_none], self.set_timestamp_usec)
-        result["value"] = from_union([lambda x: to_class(Value, x), from_none], self.value)
-        return result
-
 
 class UserDim:
-    """User related dimensions."""
+    """User related dimensions.
+    
+    Message containing information about the user associated with the event.
+    """
     """App information."""
     app_info: Optional[AppInfo]
     """Information regarding the bundle in which these events were uploaded."""
@@ -498,7 +277,7 @@ class UserDim:
     """Device information."""
     device_info: Optional[DeviceInfo]
     """The time (in microseconds) at which the user first opened the app."""
-    first_open_timestamp_micros: Optional[str]
+    first_open_timestamp_micros: Optional[int]
     """User's geographic information."""
     geo_info: Optional[GeoInfo]
     """Lifetime Value information about this user."""
@@ -510,9 +289,9 @@ class UserDim:
     """A repeated record of user properties set with the setUserProperty API.
     https://firebase.google.com/docs/analytics/android/properties
     """
-    user_properties: Optional[Dict[str, UserProperty]]
+    user_properties: Optional[Dict[str, UserPropertyValue]]
 
-    def __init__(self, app_info: Optional[AppInfo], bundle_info: Optional[BundleInfo], device_info: Optional[DeviceInfo], first_open_timestamp_micros: Optional[str], geo_info: Optional[GeoInfo], ltv_info: Optional[LtvInfo], traffic_source: Optional[TrafficSource], user_id: Optional[str], user_properties: Optional[Dict[str, UserProperty]]) -> None:
+    def __init__(self, app_info: Optional[AppInfo], bundle_info: Optional[BundleInfo], device_info: Optional[DeviceInfo], first_open_timestamp_micros: Optional[int], geo_info: Optional[GeoInfo], ltv_info: Optional[LtvInfo], traffic_source: Optional[TrafficSource], user_id: Optional[str], user_properties: Optional[Dict[str, UserPropertyValue]]) -> None:
         self.app_info = app_info
         self.bundle_info = bundle_info
         self.device_info = device_info
@@ -523,62 +302,14 @@ def __init__(self, app_info: Optional[AppInfo], bundle_info: Optional[BundleInfo
         self.user_id = user_id
         self.user_properties = user_properties
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'UserDim':
-        assert isinstance(obj, dict)
-        app_info = from_union([AppInfo.from_dict, from_none], obj.get("appInfo"))
-        bundle_info = from_union([BundleInfo.from_dict, from_none], obj.get("bundleInfo"))
-        device_info = from_union([DeviceInfo.from_dict, from_none], obj.get("deviceInfo"))
-        first_open_timestamp_micros = from_union([from_str, from_none], obj.get("firstOpenTimestampMicros"))
-        geo_info = from_union([GeoInfo.from_dict, from_none], obj.get("geoInfo"))
-        ltv_info = from_union([LtvInfo.from_dict, from_none], obj.get("ltvInfo"))
-        traffic_source = from_union([TrafficSource.from_dict, from_none], obj.get("trafficSource"))
-        user_id = from_union([from_str, from_none], obj.get("userId"))
-        user_properties = from_union([lambda x: from_dict(UserProperty.from_dict, x), from_none], obj.get("userProperties"))
-        return UserDim(app_info, bundle_info, device_info, first_open_timestamp_micros, geo_info, ltv_info, traffic_source, user_id, user_properties)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["appInfo"] = from_union([lambda x: to_class(AppInfo, x), from_none], self.app_info)
-        result["bundleInfo"] = from_union([lambda x: to_class(BundleInfo, x), from_none], self.bundle_info)
-        result["deviceInfo"] = from_union([lambda x: to_class(DeviceInfo, x), from_none], self.device_info)
-        result["firstOpenTimestampMicros"] = from_union([from_str, from_none], self.first_open_timestamp_micros)
-        result["geoInfo"] = from_union([lambda x: to_class(GeoInfo, x), from_none], self.geo_info)
-        result["ltvInfo"] = from_union([lambda x: to_class(LtvInfo, x), from_none], self.ltv_info)
-        result["trafficSource"] = from_union([lambda x: to_class(TrafficSource, x), from_none], self.traffic_source)
-        result["userId"] = from_union([from_str, from_none], self.user_id)
-        result["userProperties"] = from_union([lambda x: from_dict(lambda x: to_class(UserProperty, x), x), from_none], self.user_properties)
-        return result
-
 
 class AnalyticsLogData:
     """The data within Firebase Analytics log events."""
     """A repeated record of event related dimensions."""
-    event_dim: Optional[List[EventDim]]
+    event_dim: Optional[List[EventDimensions]]
     """User related dimensions."""
     user_dim: Optional[UserDim]
 
-    def __init__(self, event_dim: Optional[List[EventDim]], user_dim: Optional[UserDim]) -> None:
+    def __init__(self, event_dim: Optional[List[EventDimensions]], user_dim: Optional[UserDim]) -> None:
         self.event_dim = event_dim
         self.user_dim = user_dim
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'AnalyticsLogData':
-        assert isinstance(obj, dict)
-        event_dim = from_union([lambda x: from_list(EventDim.from_dict, x), from_none], obj.get("eventDim"))
-        user_dim = from_union([UserDim.from_dict, from_none], obj.get("userDim"))
-        return AnalyticsLogData(event_dim, user_dim)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["eventDim"] = from_union([lambda x: from_list(lambda x: to_class(EventDim, x), x), from_none], self.event_dim)
-        result["userDim"] = from_union([lambda x: to_class(UserDim, x), from_none], self.user_dim)
-        return result
-
-
-def analytics_log_data_from_dict(s: Any) -> AnalyticsLogData:
-    return AnalyticsLogData.from_dict(s)
-
-
-def analytics_log_data_to_dict(x: AnalyticsLogData) -> Any:
-    return to_class(AnalyticsLogData, x)
diff --git a/src/google/events/firebase/auth/v1/AuthEventData.py b/src/google/events/firebase/auth/v1/AuthEventData.py
index 9076984..34985cd 100644
--- a/src/google/events/firebase/auth/v1/AuthEventData.py
+++ b/src/google/events/firebase/auth/v1/AuthEventData.py
@@ -11,117 +11,23 @@
 # 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 code parses date/times, so please
-#
-#     pip install python-dateutil
-#
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = auth_event_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Dict, Any, List, TypeVar, Callable, Type, cast
+from typing import Optional, Dict, Any, List
 from datetime import datetime
-import dateutil.parser
-
-
-T = TypeVar("T")
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def from_datetime(x: Any) -> datetime:
-    return dateutil.parser.parse(x)
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_bool(x: Any) -> bool:
-    assert isinstance(x, bool)
-    return x
-
-
-def from_list(f: Callable[[Any], T], x: Any) -> List[T]:
-    assert isinstance(x, list)
-    return [f(y) for y in x]
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
-
-
-class CustomClaims:
-    """User's custom claims, typically used to define user roles and propagated
-    to an authenticated user's ID token.
-    """
-    """Unordered map of dynamically typed values."""
-    fields: Optional[Dict[str, Optional[Dict[str, Any]]]]
-
-    def __init__(self, fields: Optional[Dict[str, Optional[Dict[str, Any]]]]) -> None:
-        self.fields = fields
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'CustomClaims':
-        assert isinstance(obj, dict)
-        fields = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], obj.get("fields"))
-        return CustomClaims(fields)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["fields"] = from_union([lambda x: from_dict(lambda x: from_union([from_none, lambda x: from_dict(lambda x: x, x)], x), x), from_none], self.fields)
-        return result
 
 
 class Metadata:
     """Additional metadata about the user."""
     """The date the user was created."""
-    created_at: Optional[datetime]
+    create_time: Optional[datetime]
     """The date the user last signed in."""
-    last_signed_in_at: Optional[datetime]
+    last_sign_in_time: Optional[datetime]
 
-    def __init__(self, created_at: Optional[datetime], last_signed_in_at: Optional[datetime]) -> None:
-        self.created_at = created_at
-        self.last_signed_in_at = last_signed_in_at
+    def __init__(self, create_time: Optional[datetime], last_sign_in_time: Optional[datetime]) -> None:
+        self.create_time = create_time
+        self.last_sign_in_time = last_sign_in_time
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'Metadata':
-        assert isinstance(obj, dict)
-        created_at = from_union([from_datetime, from_none], obj.get("createdAt"))
-        last_signed_in_at = from_union([from_datetime, from_none], obj.get("lastSignedInAt"))
-        return Metadata(created_at, last_signed_in_at)
 
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["createdAt"] = from_union([lambda x: x.isoformat(), from_none], self.created_at)
-        result["lastSignedInAt"] = from_union([lambda x: x.isoformat(), from_none], self.last_signed_in_at)
-        return result
-
-
-class ProviderDatum:
+class UserInfo:
     """User's info at the identity provider"""
     """The display name for the linked provider."""
     display_name: Optional[str]
@@ -141,32 +47,13 @@ def __init__(self, display_name: Optional[str], email: Optional[str], photo_url:
         self.provider_id = provider_id
         self.uid = uid
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'ProviderDatum':
-        assert isinstance(obj, dict)
-        display_name = from_union([from_str, from_none], obj.get("displayName"))
-        email = from_union([from_str, from_none], obj.get("email"))
-        photo_url = from_union([from_str, from_none], obj.get("photoUrl"))
-        provider_id = from_union([from_str, from_none], obj.get("providerId"))
-        uid = from_union([from_str, from_none], obj.get("uid"))
-        return ProviderDatum(display_name, email, photo_url, provider_id, uid)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["displayName"] = from_union([from_str, from_none], self.display_name)
-        result["email"] = from_union([from_str, from_none], self.email)
-        result["photoUrl"] = from_union([from_str, from_none], self.photo_url)
-        result["providerId"] = from_union([from_str, from_none], self.provider_id)
-        result["uid"] = from_union([from_str, from_none], self.uid)
-        return result
-
 
 class AuthEventData:
     """The data within all Firebase Auth events."""
     """User's custom claims, typically used to define user roles and propagated
     to an authenticated user's ID token.
     """
-    custom_claims: Optional[CustomClaims]
+    custom_claims: Optional[Dict[str, Any]]
     """Whether the user is disabled."""
     disabled: Optional[bool]
     """The user's display name."""
@@ -182,11 +69,11 @@ class AuthEventData:
     """The user's photo URL."""
     photo_url: Optional[str]
     """User's info at the providers"""
-    provider_data: Optional[List[ProviderDatum]]
+    provider_data: Optional[List[UserInfo]]
     """The user identifier in the Firebase app."""
     uid: Optional[str]
 
-    def __init__(self, custom_claims: Optional[CustomClaims], disabled: Optional[bool], display_name: Optional[str], email: Optional[str], email_verified: Optional[bool], metadata: Optional[Metadata], phone_number: Optional[str], photo_url: Optional[str], provider_data: Optional[List[ProviderDatum]], uid: Optional[str]) -> None:
+    def __init__(self, custom_claims: Optional[Dict[str, Any]], disabled: Optional[bool], display_name: Optional[str], email: Optional[str], email_verified: Optional[bool], metadata: Optional[Metadata], phone_number: Optional[str], photo_url: Optional[str], provider_data: Optional[List[UserInfo]], uid: Optional[str]) -> None:
         self.custom_claims = custom_claims
         self.disabled = disabled
         self.display_name = display_name
@@ -197,40 +84,3 @@ def __init__(self, custom_claims: Optional[CustomClaims], disabled: Optional[boo
         self.photo_url = photo_url
         self.provider_data = provider_data
         self.uid = uid
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'AuthEventData':
-        assert isinstance(obj, dict)
-        custom_claims = from_union([CustomClaims.from_dict, from_none], obj.get("customClaims"))
-        disabled = from_union([from_bool, from_none], obj.get("disabled"))
-        display_name = from_union([from_str, from_none], obj.get("displayName"))
-        email = from_union([from_str, from_none], obj.get("email"))
-        email_verified = from_union([from_bool, from_none], obj.get("emailVerified"))
-        metadata = from_union([Metadata.from_dict, from_none], obj.get("metadata"))
-        phone_number = from_union([from_str, from_none], obj.get("phoneNumber"))
-        photo_url = from_union([from_str, from_none], obj.get("photoUrl"))
-        provider_data = from_union([lambda x: from_list(ProviderDatum.from_dict, x), from_none], obj.get("providerData"))
-        uid = from_union([from_str, from_none], obj.get("uid"))
-        return AuthEventData(custom_claims, disabled, display_name, email, email_verified, metadata, phone_number, photo_url, provider_data, uid)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["customClaims"] = from_union([lambda x: to_class(CustomClaims, x), from_none], self.custom_claims)
-        result["disabled"] = from_union([from_bool, from_none], self.disabled)
-        result["displayName"] = from_union([from_str, from_none], self.display_name)
-        result["email"] = from_union([from_str, from_none], self.email)
-        result["emailVerified"] = from_union([from_bool, from_none], self.email_verified)
-        result["metadata"] = from_union([lambda x: to_class(Metadata, x), from_none], self.metadata)
-        result["phoneNumber"] = from_union([from_str, from_none], self.phone_number)
-        result["photoUrl"] = from_union([from_str, from_none], self.photo_url)
-        result["providerData"] = from_union([lambda x: from_list(lambda x: to_class(ProviderDatum, x), x), from_none], self.provider_data)
-        result["uid"] = from_union([from_str, from_none], self.uid)
-        return result
-
-
-def auth_event_data_from_dict(s: Any) -> AuthEventData:
-    return AuthEventData.from_dict(s)
-
-
-def auth_event_data_to_dict(x: AuthEventData) -> Any:
-    return to_class(AuthEventData, x)
diff --git a/src/google/events/firebase/database/v1/ReferenceEventData.py b/src/google/events/firebase/database/v1/ReferenceEventData.py
index 09272b2..b352cf2 100644
--- a/src/google/events/firebase/database/v1/ReferenceEventData.py
+++ b/src/google/events/firebase/database/v1/ReferenceEventData.py
@@ -11,70 +11,28 @@
 # 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.
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = reference_event_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Dict, Any, TypeVar, Callable, Type, cast
-
-
-T = TypeVar("T")
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
-
-def from_dict(f: Callable[[Any], T], x: Any) -> Dict[str, T]:
-    assert isinstance(x, dict)
-    return { k: f(v) for (k, v) in x.items() }
-
-
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
-
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
+from typing import List, Any, Dict, Union
 
 
 class ReferenceEventData:
     """The data within all Firebase Real Time Database reference events."""
-    data: Optional[Dict[str, Any]]
-    delta: Optional[Dict[str, Any]]
-
-    def __init__(self, data: Optional[Dict[str, Any]], delta: Optional[Dict[str, Any]]) -> None:
+    """`Value` represents a dynamically typed value which can be either
+    null, a number, a string, a boolean, a recursive struct value, or a
+    list of values. A producer of value is expected to set one of that
+    variants, absence of any variant indicates an error.
+    
+    The JSON representation for `Value` is JSON value.
+    """
+    data: Union[List[Any], bool, float, Dict[str, Any], None, str]
+    """`Value` represents a dynamically typed value which can be either
+    null, a number, a string, a boolean, a recursive struct value, or a
+    list of values. A producer of value is expected to set one of that
+    variants, absence of any variant indicates an error.
+    
+    The JSON representation for `Value` is JSON value.
+    """
+    delta: Union[List[Any], bool, float, Dict[str, Any], None, str]
+
+    def __init__(self, data: Union[List[Any], bool, float, Dict[str, Any], None, str], delta: Union[List[Any], bool, float, Dict[str, Any], None, str]) -> None:
         self.data = data
         self.delta = delta
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'ReferenceEventData':
-        assert isinstance(obj, dict)
-        data = from_union([from_none, lambda x: from_dict(lambda x: x, x)], obj.get("data"))
-        delta = from_union([from_none, lambda x: from_dict(lambda x: x, x)], obj.get("delta"))
-        return ReferenceEventData(data, delta)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["data"] = from_union([from_none, lambda x: from_dict(lambda x: x, x)], self.data)
-        result["delta"] = from_union([from_none, lambda x: from_dict(lambda x: x, x)], self.delta)
-        return result
-
-
-def reference_event_data_from_dict(s: Any) -> ReferenceEventData:
-    return ReferenceEventData.from_dict(s)
-
-
-def reference_event_data_to_dict(x: ReferenceEventData) -> Any:
-    return to_class(ReferenceEventData, x)
diff --git a/src/google/events/firebase/firebasealerts/__init__.py b/src/google/events/firebase/firebasealerts/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/google/events/firebase/firebasealerts/v1/AlertData.py b/src/google/events/firebase/firebasealerts/v1/AlertData.py
new file mode 100644
index 0000000..91243e0
--- /dev/null
+++ b/src/google/events/firebase/firebasealerts/v1/AlertData.py
@@ -0,0 +1,34 @@
+# Copyright 2020 Google LLC
+#
+# 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
+#
+#     https://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.
+from typing import Optional, Dict, Any
+from datetime import datetime
+
+
+class AlertData:
+    """The data within all Firebase Alerts."""
+    """Time that the event has created"""
+    create_time: Optional[datetime]
+    """Time that the event has ended. Optional, only present for alertsthat are
+    ongoing
+    """
+    end_time: Optional[datetime]
+    """Payload of the event, which includes the details of the specific alert.
+    It's a map of keys of String type and values of various types
+    """
+    payload: Optional[Dict[str, Any]]
+
+    def __init__(self, create_time: Optional[datetime], end_time: Optional[datetime], payload: Optional[Dict[str, Any]]) -> None:
+        self.create_time = create_time
+        self.end_time = end_time
+        self.payload = payload
diff --git a/src/google/events/firebase/firebasealerts/v1/__init__.py b/src/google/events/firebase/firebasealerts/v1/__init__.py
new file mode 100644
index 0000000..3c509c2
--- /dev/null
+++ b/src/google/events/firebase/firebasealerts/v1/__init__.py
@@ -0,0 +1,15 @@
+# Copyright 2020 Google LLC
+#
+# 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.
+
+from .AlertData import AlertData
\ No newline at end of file
diff --git a/src/google/events/firebase/remoteconfig/v1/RemoteConfigEventData.py b/src/google/events/firebase/remoteconfig/v1/RemoteConfigEventData.py
index 091da9e..7546701 100644
--- a/src/google/events/firebase/remoteconfig/v1/RemoteConfigEventData.py
+++ b/src/google/events/firebase/remoteconfig/v1/RemoteConfigEventData.py
@@ -11,61 +11,32 @@
 # 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 code parses date/times, so please
-#
-#     pip install python-dateutil
-#
-# To use this code, make sure you
-#
-#     import json
-#
-# and then, to convert JSON from a string, do
-#
-#     result = remote_config_event_data_from_dict(json.loads(json_string))
-
-from typing import Optional, Any, Union, TypeVar, Type, cast
+from enum import Enum
+from typing import Optional, Union
 from datetime import datetime
-import dateutil.parser
-
-
-T = TypeVar("T")
-
-
-def from_str(x: Any) -> str:
-    assert isinstance(x, str)
-    return x
-
-
-def from_none(x: Any) -> Any:
-    assert x is None
-    return x
-
 
-def from_union(fs, x):
-    for f in fs:
-        try:
-            return f(x)
-        except:
-            pass
-    assert False
 
+class UpdateOriginEnum(Enum):
+    ADMIN_SDK_NODE = "ADMIN_SDK_NODE"
+    CONSOLE = "CONSOLE"
+    REMOTE_CONFIG_UPDATE_ORIGIN_UNSPECIFIED = "REMOTE_CONFIG_UPDATE_ORIGIN_UNSPECIFIED"
+    REST_API = "REST_API"
 
-def from_int(x: Any) -> int:
-    assert isinstance(x, int) and not isinstance(x, bool)
-    return x
 
+class UpdateTypeEnum(Enum):
+    FORCED_UPDATE = "FORCED_UPDATE"
+    INCREMENTAL_UPDATE = "INCREMENTAL_UPDATE"
+    REMOTE_CONFIG_UPDATE_TYPE_UNSPECIFIED = "REMOTE_CONFIG_UPDATE_TYPE_UNSPECIFIED"
+    ROLLBACK = "ROLLBACK"
 
-def from_datetime(x: Any) -> datetime:
-    return dateutil.parser.parse(x)
 
-
-def to_class(c: Type[T], x: Any) -> dict:
-    assert isinstance(x, c)
-    return cast(Any, x).to_dict()
-
-
-class UpdateUser:
-    """Aggregation of all metadata fields about the account that performed the update."""
+class User:
+    """Aggregation of all metadata fields about the account that performed the
+    update.
+    
+    All the fields associated with the person/service account
+    that wrote a Remote Config template.
+    """
     """Email address."""
     email: Optional[str]
     """Image URL."""
@@ -78,21 +49,6 @@ def __init__(self, email: Optional[str], image_url: Optional[str], name: Optiona
         self.image_url = image_url
         self.name = name
 
-    @staticmethod
-    def from_dict(obj: Any) -> 'UpdateUser':
-        assert isinstance(obj, dict)
-        email = from_union([from_str, from_none], obj.get("email"))
-        image_url = from_union([from_str, from_none], obj.get("imageUrl"))
-        name = from_union([from_str, from_none], obj.get("name"))
-        return UpdateUser(email, image_url, name)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["email"] = from_union([from_str, from_none], self.email)
-        result["imageUrl"] = from_union([from_str, from_none], self.image_url)
-        result["name"] = from_union([from_str, from_none], self.name)
-        return result
-
 
 class RemoteConfigEventData:
     """The data within all Firebase Remote Config events."""
@@ -101,19 +57,21 @@ class RemoteConfigEventData:
     """Only present if this version is the result of a rollback, and will be the
     version number of the Remote Config template that was rolled-back to.
     """
-    rollback_source: Optional[str]
+    rollback_source: Optional[int]
     """Where the update action originated."""
-    update_origin: Union[int, None, str]
+    update_origin: Union[UpdateOriginEnum, int, None]
     """When the Remote Config template was written to the Remote Config server."""
     update_time: Optional[datetime]
     """What type of update was made."""
-    update_type: Union[int, None, str]
-    """Aggregation of all metadata fields about the account that performed the update."""
-    update_user: Optional[UpdateUser]
+    update_type: Union[UpdateTypeEnum, int, None]
+    """Aggregation of all metadata fields about the account that performed the
+    update.
+    """
+    update_user: Optional[User]
     """The version number of the version's corresponding Remote Config template."""
-    version_number: Optional[str]
+    version_number: Optional[int]
 
-    def __init__(self, description: Optional[str], rollback_source: Optional[str], update_origin: Union[int, None, str], update_time: Optional[datetime], update_type: Union[int, None, str], update_user: Optional[UpdateUser], version_number: Optional[str]) -> None:
+    def __init__(self, description: Optional[str], rollback_source: Optional[int], update_origin: Union[UpdateOriginEnum, int, None], update_time: Optional[datetime], update_type: Union[UpdateTypeEnum, int, None], update_user: Optional[User], version_number: Optional[int]) -> None:
         self.description = description
         self.rollback_source = rollback_source
         self.update_origin = update_origin
@@ -121,34 +79,3 @@ def __init__(self, description: Optional[str], rollback_source: Optional[str], u
         self.update_type = update_type
         self.update_user = update_user
         self.version_number = version_number
-
-    @staticmethod
-    def from_dict(obj: Any) -> 'RemoteConfigEventData':
-        assert isinstance(obj, dict)
-        description = from_union([from_str, from_none], obj.get("description"))
-        rollback_source = from_union([from_str, from_none], obj.get("rollbackSource"))
-        update_origin = from_union([from_int, from_str, from_none], obj.get("updateOrigin"))
-        update_time = from_union([from_datetime, from_none], obj.get("updateTime"))
-        update_type = from_union([from_int, from_str, from_none], obj.get("updateType"))
-        update_user = from_union([UpdateUser.from_dict, from_none], obj.get("updateUser"))
-        version_number = from_union([from_str, from_none], obj.get("versionNumber"))
-        return RemoteConfigEventData(description, rollback_source, update_origin, update_time, update_type, update_user, version_number)
-
-    def to_dict(self) -> dict:
-        result: dict = {}
-        result["description"] = from_union([from_str, from_none], self.description)
-        result["rollbackSource"] = from_union([from_str, from_none], self.rollback_source)
-        result["updateOrigin"] = from_union([from_int, from_str, from_none], self.update_origin)
-        result["updateTime"] = from_union([lambda x: x.isoformat(), from_none], self.update_time)
-        result["updateType"] = from_union([from_int, from_str, from_none], self.update_type)
-        result["updateUser"] = from_union([lambda x: to_class(UpdateUser, x), from_none], self.update_user)
-        result["versionNumber"] = from_union([from_str, from_none], self.version_number)
-        return result
-
-
-def remote_config_event_data_from_dict(s: Any) -> RemoteConfigEventData:
-    return RemoteConfigEventData.from_dict(s)
-
-
-def remote_config_event_data_to_dict(x: RemoteConfigEventData) -> Any:
-    return to_class(RemoteConfigEventData, x)


Test patch:
diff --git a/src/google/events/firebase/testlab/__init__.py b/src/google/events/firebase/testlab/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/google/events/firebase/testlab/v1/TestMatrixEventData.py b/src/google/events/firebase/testlab/v1/TestMatrixEventData.py
new file mode 100644
index 0000000..abf6f5b
--- /dev/null
+++ b/src/google/events/firebase/testlab/v1/TestMatrixEventData.py
@@ -0,0 +1,106 @@
+# Copyright 2020 Google LLC
+#
+# 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
+#
+#     https://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.
+from typing import Optional, Dict, Union
+from enum import Enum
+from datetime import datetime
+
+
+class ClientInfo:
+    """Information provided by the client that created the test matrix.
+    
+    Information about the client which invoked the test.
+    """
+    """Client name, such as "gcloud"."""
+    client: Optional[str]
+    """Map of detailed information about the client."""
+    details: Optional[Dict[str, str]]
+
+    def __init__(self, client: Optional[str], details: Optional[Dict[str, str]]) -> None:
+        self.client = client
+        self.details = details
+
+
+class OutcomeSummaryEnum(Enum):
+    FAILURE = "FAILURE"
+    INCONCLUSIVE = "INCONCLUSIVE"
+    OUTCOME_SUMMARY_UNSPECIFIED = "OUTCOME_SUMMARY_UNSPECIFIED"
+    SKIPPED = "SKIPPED"
+    SUCCESS = "SUCCESS"
+
+
+class ResultStorage:
+    """Locations where test results are stored."""
+    """Location in Google Cloud Storage where test results are written to.
+    In the form "gs://bucket/path/to/somewhere".
+    """
+    gcs_path: Optional[str]
+    """URI to the test results in the Firebase Web Console."""
+    results_uri: Optional[str]
+    """Tool Results execution resource containing test results. Format is
+    `projects/{project_id}/histories/{history_id}/executions/{execution_id}`.
+    Optional, can be omitted in erroneous test states.
+    See https://firebase.google.com/docs/test-lab/reference/toolresults/rest
+    for more information.
+    """
+    tool_results_execution: Optional[str]
+    """Tool Results history resource containing test results. Format is
+    `projects/{project_id}/histories/{history_id}`.
+    See https://firebase.google.com/docs/test-lab/reference/toolresults/rest
+    for more information.
+    """
+    tool_results_history: Optional[str]
+
+    def __init__(self, gcs_path: Optional[str], results_uri: Optional[str], tool_results_execution: Optional[str], tool_results_history: Optional[str]) -> None:
+        self.gcs_path = gcs_path
+        self.results_uri = results_uri
+        self.tool_results_execution = tool_results_execution
+        self.tool_results_history = tool_results_history
+
+
+class StateEnum(Enum):
+    ERROR = "ERROR"
+    FINISHED = "FINISHED"
+    INVALID = "INVALID"
+    PENDING = "PENDING"
+    TEST_STATE_UNSPECIFIED = "TEST_STATE_UNSPECIFIED"
+    VALIDATING = "VALIDATING"
+
+
+class TestMatrixEventData:
+    """The data within all Firebase test matrix events."""
+    """Information provided by the client that created the test matrix."""
+    client_info: Optional[ClientInfo]
+    """Time the test matrix was created."""
+    create_time: Optional[datetime]
+    """Code that describes why the test matrix is considered invalid. Only set for
+    matrices in the INVALID state.
+    """
+    invalid_matrix_details: Optional[str]
+    """Outcome summary of the test matrix."""
+    outcome_summary: Union[OutcomeSummaryEnum, int, None]
+    """Locations where test results are stored."""
+    result_storage: Optional[ResultStorage]
+    """State of the test matrix."""
+    state: Union[StateEnum, int, None]
+    """ID of the test matrix this event belongs to."""
+    test_matrix_id: Optional[str]
+
+    def __init__(self, client_info: Optional[ClientInfo], create_time: Optional[datetime], invalid_matrix_details: Optional[str], outcome_summary: Union[OutcomeSummaryEnum, int, None], result_storage: Optional[ResultStorage], state: Union[StateEnum, int, None], test_matrix_id: Optional[str]) -> None:
+        self.client_info = client_info
+        self.create_time = create_time
+        self.invalid_matrix_details = invalid_matrix_details
+        self.outcome_summary = outcome_summary
+        self.result_storage = result_storage
+        self.state = state
+        self.test_matrix_id = test_matrix_id
diff --git a/src/google/events/firebase/testlab/v1/__init__.py b/src/google/events/firebase/testlab/v1/__init__.py
new file mode 100644
index 0000000..37b1927
--- /dev/null
+++ b/src/google/events/firebase/testlab/v1/__init__.py
@@ -0,0 +1,15 @@
+# Copyright 2020 Google LLC
+#
+# 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.
+
+from .TestMatrixEventData import TestMatrixEventData
\ No newline at end of file
diff --git a/tests/data/cloud_audit_v1_logentrydata_bigqueryjobcompleted.json b/tests/data/cloud_audit_v1_logentrydata_bigqueryjobcompleted.json
new file mode 100644
index 0000000..54c9a89
--- /dev/null
+++ b/tests/data/cloud_audit_v1_logentrydata_bigqueryjobcompleted.json
@@ -0,0 +1,78 @@
+{
+    "insertId": "jpllvgecd7bx",
+    "logName": "projects/test-project/logs/cloudaudit.googleapis.com%2Fdata_access",
+    "protoPayload": {
+      "authenticationInfo": {
+        "principalEmail": "robot@test-project.iam.gserviceaccount.com"
+      },
+      "methodName": "jobservice.jobcompleted",
+      "requestMetadata": {
+        "callerIp": "2620:15c:0:200:1a75:e914:115b:e970",
+        "callerSuppliedUserAgent": "google-cloud-sdk357.0.0 (gzip),gzip(gfe)",
+        "destinationAttributes": {},
+        "requestAttributes": {}
+      },
+      "resourceName": "projects/test-project/jobs/bqjob_r3ac45813612fa2d6_0000017d591922c9_1",
+      "serviceData": {
+        "@type": "type.googleapis.com/google.cloud.bigquery.logging.v1.AuditData",
+        "jobCompletedEvent": {
+          "eventName": "query_job_completed",
+          "job": {
+            "jobConfiguration": {
+              "query": {
+                "createDisposition": "CREATE_IF_NEEDED",
+                "defaultDataset": {},
+                "destinationTable": {
+                  "datasetId": "_1f5a368b27df6124588f6733820599593e869a8a",
+                  "projectId": "test-project",
+                  "tableId": "anon1f50c147_3e76_44d8_a863_44a8ab3deb61"
+                },
+                "query": "SELECT * FROM `bigquery-samples`.reddit.full LIMIT 10",
+                "queryPriority": "QUERY_INTERACTIVE",
+                "statementType": "SELECT",
+                "writeDisposition": "WRITE_TRUNCATE"
+              }
+            },
+            "jobName": {
+              "jobId": "bqjob_r3ac45813612fa2d6_0000017d591922c9_1",
+              "location": "US",
+              "projectId": "test-project"
+            },
+            "jobStatistics": {
+              "billingTier": 1,
+              "createTime": "2021-11-25T21:55:59.872Z",
+              "endTime": "2021-11-25T21:56:00.236Z",
+              "queryOutputRowCount": "10",
+              "referencedTables": [
+                {
+                  "datasetId": "reddit",
+                  "projectId": "bigquery-samples",
+                  "tableId": "full"
+                }
+              ],
+              "startTime": "2021-11-25T21:55:59.956Z",
+              "totalBilledBytes": "1450180608",
+              "totalProcessedBytes": "1449319174",
+              "totalSlotMs": "46",
+              "totalTablesProcessed": 1
+            },
+            "jobStatus": {
+              "error": {},
+              "state": "DONE"
+            }
+          }
+        }
+      },
+      "serviceName": "bigquery.googleapis.com",
+      "status": {}
+    },
+    "receiveTimestamp": "2021-11-25T21:56:00.653866570Z",
+    "resource": {
+      "labels": {
+        "project_id": "test-project"
+      },
+      "type": "bigquery_resource"
+    },
+    "severity": "INFO",
+    "timestamp": "2021-11-25T21:56:00.276607Z"
+}
diff --git a/tests/data/cloud_cloudbuild_v1_buildeventdata_complex.json b/tests/data/cloud_cloudbuild_v1_buildeventdata_complex.json
new file mode 100644
index 0000000..24cce0e
--- /dev/null
+++ b/tests/data/cloud_cloudbuild_v1_buildeventdata_complex.json
@@ -0,0 +1,75 @@
+{
+  "timeout": "660s",
+  "createTime": "1993-07-25T02:32:41.388Z",
+  "tags": [
+    "dolor exercitation",
+    "sit id consequat",
+    "dolore eu sit irure esse"
+  ],
+  "buildTriggerId": "cupidatat",
+  "logUrl": "http://example.com",
+  "images": [
+    "http://example.com",
+    "http://example.com"
+  ],
+  "options": {
+    "substitutionOption": "MUST_MATCH",
+    "env": [
+      "string1"
+    ],
+    "volumes": [],
+    "machineType": 1,
+    "logging": "GCS_ONLY",
+    "diskSizeGb": 18311588,
+    "sourceProvenanceHash": [
+      "SHA256",
+      "MD5"
+    ],
+    "secretEnv": [
+      "secret"
+    ],
+    "logStreamingOption": "STREAM_ON",
+    "workerPool": "cupidatat",
+    "requestedVerifyOption": "NOT_VERIFIED"
+  },
+  "results": {
+    "buildStepOutputs": [
+      "out1"
+    ],
+    "images": [],
+    "numArtifacts": 3306780,
+    "buildStepImages": [
+      "http://example.com"
+    ],
+    "artifactTiming": {
+      "startTime": "1995-03-02T21:38:07.876Z",
+      "endTime": "2006-06-09T14:32:38.775Z"
+    },
+    "artifactManifest": "officia aliqua mollit"
+  },
+  "artifacts": {
+    "images": [
+      "http://example.com"
+    ],
+    "objects": {
+      "location": "laborum sunt in",
+      "paths": []
+    }
+  },
+  "status": "SUCCESS",
+  "secrets": [
+    {
+      "kmsKeyName": "ut magna velit"
+    }
+  ],
+  "source": {
+    "storageSource": {
+      "bucket": "sample-bucket",
+      "object": "my-object.txt",
+      "generation": "1587627537231057"
+    }
+  },
+  "logsBucket": "esse sunt ex",
+  "projectId": "quis minim est laborum ex",
+  "queueTtl": "660s"
+}
\ No newline at end of file
diff --git a/tests/data/cloud_cloudbuild_v1_buildeventdata_simple.json b/tests/data/cloud_cloudbuild_v1_buildeventdata_simple.json
new file mode 100644
index 0000000..4e8ab9b
--- /dev/null
+++ b/tests/data/cloud_cloudbuild_v1_buildeventdata_simple.json
@@ -0,0 +1,17 @@
+{
+  "timeout": "660s",
+  "createTime": "1993-07-25T02:32:41.388Z",
+  "tags": [
+    "dolor exercitation",
+    "sit id consequat",
+    "dolore eu sit irure esse"
+  ],
+  "buildTriggerId": "cupidatat",
+  "logUrl": "http://example.com",
+  "images": [
+    "http://example.com",
+    "http://example.com"
+  ],
+  "projectId": "quis minim est laborum ex",
+  "queueTtl": "660s"
+}
\ No newline at end of file
diff --git a/tests/data/cloud_pubsub_v1_messagepublisheddata_binary.json b/tests/data/cloud_pubsub_v1_messagepublisheddata_binary.json
index 9e164ae..228aa78 100644
--- a/tests/data/cloud_pubsub_v1_messagepublisheddata_binary.json
+++ b/tests/data/cloud_pubsub_v1_messagepublisheddata_binary.json
@@ -3,6 +3,7 @@
   "message": {
     "@type": "type.googleapis.com/google.pubsub.v1.PubsubMessage",
     "data": "AQIDBA==",
-    "messageId": "message-id"
+    "messageId": "message-id",
+    "publishTime":"2021-02-05T04:06:14.109Z"
   }
 }
diff --git a/tests/data/cloud_pubsub_v1_messagepublisheddata_text.json b/tests/data/cloud_pubsub_v1_messagepublisheddata_text.json
index 4ed66e8..33e4ac2 100644
--- a/tests/data/cloud_pubsub_v1_messagepublisheddata_text.json
+++ b/tests/data/cloud_pubsub_v1_messagepublisheddata_text.json
@@ -5,6 +5,8 @@
     "attributes": {
       "attr1":"attr1-value"
     },
-    "data": "dGVzdCBtZXNzYWdlIDM="
+    "data": "dGVzdCBtZXNzYWdlIDM=",
+    "messageId": "message-id",
+    "publishTime":"2021-02-05T04:06:14.109Z"
   }
 }
diff --git a/tests/data/cloud_scheduler_v1_schedulerjobdata_simple.json b/tests/data/cloud_scheduler_v1_schedulerjobdata_simple.json
new file mode 100644
index 0000000..9278386
--- /dev/null
+++ b/tests/data/cloud_scheduler_v1_schedulerjobdata_simple.json
@@ -0,0 +1,3 @@
+{
+  "customData": "bXkgYmFzZTY0IGRhdGE="
+}
\ No newline at end of file
diff --git a/tests/data/cloud_storage_v1_storageobjectdata_complex.json b/tests/data/cloud_storage_v1_storageobjectdata_complex.json
new file mode 100644
index 0000000..b810c08
--- /dev/null
+++ b/tests/data/cloud_storage_v1_storageobjectdata_complex.json
@@ -0,0 +1,31 @@
+{
+  "bucket": "sample-bucket",
+  "cacheControl": "in nostrud dolore enim adipisicing",
+  "componentCount": 2239872,
+  "contentDisposition": "cupidatat aliqua exercitation",
+  "contentEncoding": "gzip",
+  "contentLanguage": "ut incididunt",
+  "contentType": "esse commodo",
+  "crc32c": "AAAAAA==",
+  "customerEncryption": { "keySha256": "est elit", "encryptionAlgorithm": "enim mollit" },
+  "etag": "COu8mb3Dn+kCEAE=",
+  "eventBasedHold": true,
+  "generation": 96883251,
+  "id": "sample-bucket/MyFile/1588778055917163",
+  "kind": "storage#object",
+  "kmsKeyName": "nulla",
+  "md5Hash": "xrX0h3SqCoeoKidv+GvlBw==",
+  "mediaLink": "https://www.googleapis.com/download/storage/v1/b/projectid-sample-bucket/o/MyFile?generation=1588778055917163\u0026alt=media",
+  "metadata": {},
+  "metageneration": 1,
+  "name": "MyFile",
+  "retentionExpirationTime": "1960-08-15T07:40:17.432Z",
+  "selfLink": "https://www.googleapis.com/storage/v1/b/projectid-sample-bucket/o/MyFile",
+  "size": 0,
+  "storageClass": "MULTI_REGIONAL",
+  "temporaryHold": false,
+  "timeCreated": "2020-05-06T15:14:15.917Z",
+  "timeDeleted": "2020-05-18T09:07:51.799Z",
+  "timeStorageClassUpdated": "1988-10-25T10:29:01.558Z",
+  "updated": "1970-09-15T14:05:26.975Z"
+}
\ No newline at end of file
diff --git a/tests/data/cloud_storage_v1_storageobjectdata_simple.json b/tests/data/cloud_storage_v1_storageobjectdata_simple.json
index 86ec37b..1a9923f 100644
--- a/tests/data/cloud_storage_v1_storageobjectdata_simple.json
+++ b/tests/data/cloud_storage_v1_storageobjectdata_simple.json
@@ -1,7 +1,7 @@
 {
   "bucket": "some-bucket",
   "contentType": "text/plain",
-  "crc32C": "rTVTeQ==",
+  "crc32c": "rTVTeQ==",
   "etag": "CNHZkbuF/ugCEAE=",
   "generation": "1587627537231057",
   "id": "some-bucket/folder/Test.cs/1587627537231057",
@@ -13,7 +13,7 @@
   "selfLink": "https://www.googleapis.com/storage/v1/b/some-bucket/o/folder/Test.cs",
   "size": "352",
   "storageClass": "MULTI_REGIONAL",
-  "timeCreated": "2020-04-23T07:38:57.23Z",
-  "timeStorageClassUpdated": "2020-04-23T07:38:57.23Z",
-  "updated": "2020-04-23T07:38:57.23Z"
+  "timeCreated": "2020-04-23T07:38:57.230Z",
+  "timeStorageClassUpdated": "2020-04-23T07:38:57.230Z",
+  "updated": "2020-04-23T07:38:57.230Z"
 }
diff --git a/tests/data/firebase_analytics_v1_analyticslogdata_complex.json b/tests/data/firebase_analytics_v1_analyticslogdata_complex.json
new file mode 100644
index 0000000..3a3b1bb
--- /dev/null
+++ b/tests/data/firebase_analytics_v1_analyticslogdata_complex.json
@@ -0,0 +1,72 @@
+{
+  "userDim": {
+    "appInfo": {
+      "appId": "com.example.exampleapp",
+      "appInstanceId": "aaabbb11122233344455566677788899",
+      "appPlatform": "ANDROID",
+      "appStore": "com.android.vending",
+      "appVersion": "1.67"
+    },
+    "bundleInfo": {
+      "bundleSequenceId": 58,
+      "serverTimestampOffsetMicros": "875910"
+    },
+    "deviceInfo": {
+      "deviceCategory": "mobile",
+      "deviceModel": "SM-A307G",
+      "deviceTimeZoneOffsetSeconds": -10800,
+      "mobileBrandName": "Samsung",
+      "mobileMarketingName": "Galaxy A30s",
+      "mobileModelName": "SM-A307G",
+      "platformVersion": "10",
+      "resettableDeviceId": "aaaaaa-1111-bbbb-2222-dddddddddddd",
+      "userDefaultLanguage": "es-us"
+    },
+    "firstOpenTimestampMicros": "1606882687506000",
+    "geoInfo": {
+      "city": "Burzaco",
+      "continent": "005",
+      "country": "Argentina",
+      "region": "Buenos Aires Province"
+    },
+    "userId": "0123456789abcdef0123456789abcdef",
+    "userProperties": {
+      "completed_tutorial": {
+        "setTimestampUsec": "1606948068187909",
+        "value": { "stringValue": "true" }
+      },
+      "first_open_time": {
+        "setTimestampUsec": "1606882688381909",
+        "value": { "intValue": "1606885200000" }
+      },
+      "last_level": {
+        "index": 10,
+        "setTimestampUsec": "1606952210498909",
+        "value": { "stringValue": "school" }
+      },
+      "user_id": {
+        "setTimestampUsec": "1606955180040909",
+        "value": { "stringValue": "abcdef0123456789abcdef0123456789" }
+      }
+    }
+  },
+  "eventDim": [
+    {
+      "date": "20201202",
+      "name": "session_start",
+      "params": {
+        "engaged_session_event": { "intValue": "1" },
+        "firebase_conversion": { "intValue": "1" },
+        "firebase_event_origin": { "stringValue": "auto" },
+        "firebase_screen": { "stringValue": "app_menu" },
+        "firebase_screen_class": { "stringValue": "AppActivity" },
+        "firebase_screen_id": { "intValue": "-2415111648950109400" },
+        "ga_session_id": { "intValue": "1606965190" },
+        "ga_session_number": { "intValue": "7" },
+        "session_engaged": { "intValue": "1" }
+      },
+      "previousTimestampMicros": "1606951997533000",
+      "timestampMicros": "1606955191246909"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/tests/data/firebase_auth_v1_autheventdata_complex.json b/tests/data/firebase_auth_v1_autheventdata_complex.json
new file mode 100644
index 0000000..335961e
--- /dev/null
+++ b/tests/data/firebase_auth_v1_autheventdata_complex.json
@@ -0,0 +1,15 @@
+{
+  "email": "test@nowhere.com",
+  "metadata": {
+    "createTime": "2020-05-26T10:42:27Z",
+    "lastSignInTime": "2020-05-29T11:00:00Z"
+  },
+  "providerData": [
+    {
+      "email": "test@nowhere.com",
+      "providerId": "password",
+      "uid": "test@nowhere.com"
+    }
+  ],
+  "uid": "UUpby3s4spZre6kHsgVSPetzQ8l2"
+}
\ No newline at end of file
diff --git a/tests/data/firebase_database_v1_referenceeventdata_simple.json b/tests/data/firebase_database_v1_referenceeventdata_simple.json
new file mode 100644
index 0000000..96eb4a6
--- /dev/null
+++ b/tests/data/firebase_database_v1_referenceeventdata_simple.json
@@ -0,0 +1,16 @@
+{
+  "data": {
+    "deeply": {
+      "nested": {
+        "text": "This is deeply nested",
+        "text2": "Second value"
+      }
+    },
+    "grandchild": "other changed"
+  },
+  "delta": {
+    "deeply": {
+      "abc": "def"
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/data/firebase_remoteconfig_v1_remoteconfigeventdata_simple.json b/tests/data/firebase_remoteconfig_v1_remoteconfigeventdata_simple.json
new file mode 100644
index 0000000..282da18
--- /dev/null
+++ b/tests/data/firebase_remoteconfig_v1_remoteconfigeventdata_simple.json
@@ -0,0 +1,13 @@
+{
+  "updateOrigin":"CONSOLE",
+  "updateTime":"2020-11-16T16:35:33.569229Z",
+  "updateType":"INCREMENTAL_UPDATE",
+  "updateUser":{
+    "name": "Ut ad aute",
+     "email":"test@nowhere.com",
+     "imageUrl": "http://google.com/favicon.ico"
+  },
+  "versionNumber":"5",
+  "rollbackSource": 75404139,
+  "description": "minim reprehenderit Lorem qui proident"
+}
\ No newline at end of file
diff --git a/tests/test_cloud_audit_v1.py b/tests/test_cloud_audit_v1.py
index ef3046c..ab65bbb 100644
--- a/tests/test_cloud_audit_v1.py
+++ b/tests/test_cloud_audit_v1.py
@@ -18,6 +18,16 @@
 
 from helper import compare_values
 
+def test_cloud_audit_v1_logentrydata_bigqueryjobcompleted():
+    from google.events.cloud.audit.v1 import LogEntryData
+    with open('tests/data/cloud_audit_v1_logentrydata_bigqueryjobcompleted.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = LogEntryData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
 def test_cloud_audit_v1_logentrydata_pubsubcreatetopic():
     from google.events.cloud.audit.v1 import LogEntryData
     with open('tests/data/cloud_audit_v1_logentrydata_pubsubcreatetopic.json') as f:
diff --git a/tests/test_cloud_cloudbuild_v1.py b/tests/test_cloud_cloudbuild_v1.py
index 1abc4a0..ec110da 100644
--- a/tests/test_cloud_cloudbuild_v1.py
+++ b/tests/test_cloud_cloudbuild_v1.py
@@ -18,3 +18,23 @@
 
 from helper import compare_values
 
+def test_cloud_cloudbuild_v1_buildeventdata_complex():
+    from google.events.cloud.cloudbuild.v1 import BuildEventData
+    with open('tests/data/cloud_cloudbuild_v1_buildeventdata_complex.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = BuildEventData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
+def test_cloud_cloudbuild_v1_buildeventdata_simple():
+    from google.events.cloud.cloudbuild.v1 import BuildEventData
+    with open('tests/data/cloud_cloudbuild_v1_buildeventdata_simple.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = BuildEventData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
diff --git a/tests/test_cloud_scheduler_v1.py b/tests/test_cloud_scheduler_v1.py
index 1abc4a0..b05b05e 100644
--- a/tests/test_cloud_scheduler_v1.py
+++ b/tests/test_cloud_scheduler_v1.py
@@ -18,3 +18,13 @@
 
 from helper import compare_values
 
+def test_cloud_scheduler_v1_schedulerjobdata_simple():
+    from google.events.cloud.scheduler.v1 import SchedulerJobData
+    with open('tests/data/cloud_scheduler_v1_schedulerjobdata_simple.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = SchedulerJobData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
diff --git a/tests/test_cloud_storage_v1.py b/tests/test_cloud_storage_v1.py
index f1e8646..aed486b 100644
--- a/tests/test_cloud_storage_v1.py
+++ b/tests/test_cloud_storage_v1.py
@@ -18,6 +18,16 @@
 
 from helper import compare_values
 
+def test_cloud_storage_v1_storageobjectdata_complex():
+    from google.events.cloud.storage.v1 import StorageObjectData
+    with open('tests/data/cloud_storage_v1_storageobjectdata_complex.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = StorageObjectData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
 def test_cloud_storage_v1_storageobjectdata_simple():
     from google.events.cloud.storage.v1 import StorageObjectData
     with open('tests/data/cloud_storage_v1_storageobjectdata_simple.json') as f:
diff --git a/tests/test_firebase_analytics_v1.py b/tests/test_firebase_analytics_v1.py
index 1abc4a0..ea46e69 100644
--- a/tests/test_firebase_analytics_v1.py
+++ b/tests/test_firebase_analytics_v1.py
@@ -18,3 +18,13 @@
 
 from helper import compare_values
 
+def test_firebase_analytics_v1_analyticslogdata_complex():
+    from google.events.firebase.analytics.v1 import AnalyticsLogData
+    with open('tests/data/firebase_analytics_v1_analyticslogdata_complex.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = AnalyticsLogData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
diff --git a/tests/test_firebase_auth_v1.py b/tests/test_firebase_auth_v1.py
index 1abc4a0..b87ba9e 100644
--- a/tests/test_firebase_auth_v1.py
+++ b/tests/test_firebase_auth_v1.py
@@ -18,3 +18,13 @@
 
 from helper import compare_values
 
+def test_firebase_auth_v1_autheventdata_complex():
+    from google.events.firebase.auth.v1 import AuthEventData
+    with open('tests/data/firebase_auth_v1_autheventdata_complex.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = AuthEventData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
diff --git a/tests/test_firebase_database_v1.py b/tests/test_firebase_database_v1.py
index 1abc4a0..0366915 100644
--- a/tests/test_firebase_database_v1.py
+++ b/tests/test_firebase_database_v1.py
@@ -18,3 +18,13 @@
 
 from helper import compare_values
 
+def test_firebase_database_v1_referenceeventdata_simple():
+    from google.events.firebase.database.v1 import ReferenceEventData
+    with open('tests/data/firebase_database_v1_referenceeventdata_simple.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = ReferenceEventData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
diff --git a/tests/test_firebase_firebasealerts_v1.py b/tests/test_firebase_firebasealerts_v1.py
new file mode 100644
index 0000000..1abc4a0
--- /dev/null
+++ b/tests/test_firebase_firebasealerts_v1.py
@@ -0,0 +1,20 @@
+# Copyright 2020 Google LLC
+#
+# 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.
+
+import json
+
+import stringcase
+
+from helper import compare_values
+
diff --git a/tests/test_firebase_remoteconfig_v1.py b/tests/test_firebase_remoteconfig_v1.py
index 1abc4a0..4cc81e7 100644
--- a/tests/test_firebase_remoteconfig_v1.py
+++ b/tests/test_firebase_remoteconfig_v1.py
@@ -18,3 +18,13 @@
 
 from helper import compare_values
 
+def test_firebase_remoteconfig_v1_remoteconfigeventdata_simple():
+    from google.events.firebase.remoteconfig.v1 import RemoteConfigEventData
+    with open('tests/data/firebase_remoteconfig_v1_remoteconfigeventdata_simple.json') as f:
+        raw_data = f.read()
+    
+    event_dikt = json.loads(raw_data)
+
+    obj = RemoteConfigEventData.from_dict(event_dikt)
+    compare_values(obj, event_dikt)
+
diff --git a/tests/test_firebase_testlab_v1.py b/tests/test_firebase_testlab_v1.py
new file mode 100644
index 0000000..1abc4a0
--- /dev/null
+++ b/tests/test_firebase_testlab_v1.py
@@ -0,0 +1,20 @@
+# Copyright 2020 Google LLC
+#
+# 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.
+
+import json
+
+import stringcase
+
+from helper import compare_values
+