diff --git a/config.yaml b/config.yaml
index f9127b6..3b910aa 100644
--- a/config.yaml
+++ b/config.yaml
@@ -1,6 +1,6 @@
 packages:
 - googleapis:
-    version: 0.3.0
+    version: 0.3.1
     author: Dart Team <misc@dartlang.org>
     homepage: http://www.dartlang.org/googleapis/
     readme: resources/README.md
@@ -64,7 +64,7 @@
     - youtubeAnalytics:v1  # https://developers.google.com/youtube/analytics/
 
 - googleapis_beta:
-    version: 0.3.0
+    version: 0.4.0
     author: Dart Team <misc@dartlang.org>
     homepage: http://www.dartlang.org/googleapis/
     readme: resources/README.md
diff --git a/discovery/googleapis/adexchangebuyer__v1.3.json b/discovery/googleapis/adexchangebuyer__v1.3.json
index 6e7e3df..a4d9037 100644
--- a/discovery/googleapis/adexchangebuyer__v1.3.json
+++ b/discovery/googleapis/adexchangebuyer__v1.3.json
@@ -15,7 +15,7 @@
     "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/0kz2zxQKsIBl0qYxRIDwLH2tZt0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/IVGyzh-ksfiNeReN3JTCPs1PtOY\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -593,7 +593,7 @@
             }
         }
     },
-    "revision": "20140930",
+    "revision": "20141015",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adexchangeseller__v1.1.json b/discovery/googleapis/adexchangeseller__v1.1.json
index 5375fcd..b588cd9 100644
--- a/discovery/googleapis/adexchangeseller__v1.1.json
+++ b/discovery/googleapis/adexchangeseller__v1.1.json
@@ -18,7 +18,7 @@
     "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/POEEufAfiLYxJ9Zh7gjQEnt9dlY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/pG7SyB4d-epWWOL8eWUN-FhkzoQ\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -704,7 +704,7 @@
             }
         }
     },
-    "revision": "20141006",
+    "revision": "20141008",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adexchangeseller__v2.0.json b/discovery/googleapis/adexchangeseller__v2.0.json
index 09c5c14..9d900c2 100644
--- a/discovery/googleapis/adexchangeseller__v2.0.json
+++ b/discovery/googleapis/adexchangeseller__v2.0.json
@@ -18,7 +18,7 @@
     "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/tWYKKrV62eVz4FKUf7inu6a5kwQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/y3xsyVARAcA3R18GJnQOPEEVDu8\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -654,7 +654,7 @@
             }
         }
     },
-    "revision": "20141006",
+    "revision": "20141008",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/admin__directory_v1.json b/discovery/googleapis/admin__directory_v1.json
index e30d9c8..1ef395f 100644
--- a/discovery/googleapis/admin__directory_v1.json
+++ b/discovery/googleapis/admin__directory_v1.json
@@ -69,7 +69,7 @@
     "description": "The Admin SDK Directory API lets you view and manage enterprise resources such as users and groups, administrative notifications, security features, and more.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/directory/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/s9KxklGD8Epkl54bOAhZ92wO9kY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/l5pod8YqQveewbHEUdz0VFkXQt0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -2511,7 +2511,7 @@
             }
         }
     },
-    "revision": "20141001",
+    "revision": "20141014",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Alias": {
@@ -2683,6 +2683,25 @@
             "description": "JSON template for Chrome Os Device resource in Directory API.",
             "id": "ChromeOsDevice",
             "properties": {
+                "activeTimeRanges": {
+                    "description": "List of active time ranges (Read-only)",
+                    "items": {
+                        "properties": {
+                            "activeTime": {
+                                "description": "Duration in milliseconds",
+                                "format": "int32",
+                                "type": "integer"
+                            },
+                            "date": {
+                                "description": "Date of usage",
+                                "format": "date",
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
                 "annotatedLocation": {
                     "description": "Address or location of the device as noted by the administrator",
                     "type": "string"
diff --git a/discovery/googleapis/admin__email_migration_v2.json b/discovery/googleapis/admin__email_migration_v2.json
index c146935..3d8cb2b 100644
--- a/discovery/googleapis/admin__email_migration_v2.json
+++ b/discovery/googleapis/admin__email_migration_v2.json
@@ -14,7 +14,7 @@
     "description": "Email Migration API lets you migrate emails of users to Google backends.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/email-migration/v2/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/Dam2iHq0kOgu8qnsdYB9fhgy5SY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/Dam2iHq0kOgu8qnsdYB9fhgy5SY\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/googlemail-16.png",
         "x32": "https://www.google.com/images/icons/product/googlemail-32.png"
diff --git a/discovery/googleapis/admin__reports_v1.json b/discovery/googleapis/admin__reports_v1.json
index 9fff7af..9e3e25e 100644
--- a/discovery/googleapis/admin__reports_v1.json
+++ b/discovery/googleapis/admin__reports_v1.json
@@ -18,7 +18,7 @@
     "description": "Allows the administrators of Google Apps customers to fetch reports about the usage, collaboration, security and risk for their users.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/reports/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/kIY0aqiDkZ24yMy88cSNtVuMbHk\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/kIY0aqiDkZ24yMy88cSNtVuMbHk\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/adsense__v1.4.json b/discovery/googleapis/adsense__v1.4.json
index 76684ef..98c4eaf 100644
--- a/discovery/googleapis/adsense__v1.4.json
+++ b/discovery/googleapis/adsense__v1.4.json
@@ -18,7 +18,7 @@
     "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/management/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/_VzEntLobxdxwiwmwP_NSklqytY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2P4t9CDV6wkmyWLEzXAW3YJ1RVQ\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1624,7 +1624,7 @@
             }
         }
     },
-    "revision": "20141006",
+    "revision": "20141008",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adsensehost__v4.1.json b/discovery/googleapis/adsensehost__v4.1.json
index 59e7514..42434b1 100644
--- a/discovery/googleapis/adsensehost__v4.1.json
+++ b/discovery/googleapis/adsensehost__v4.1.json
@@ -15,7 +15,7 @@
     "description": "Gives AdSense Hosts access to report generation, ad code generation, and publisher management capabilities.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/host/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/OqgyCijz1Sw0cmnZK1SmKAtSERU\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/FAggQAR0qX2kpZA6IFcY3hA9tFs\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1072,7 +1072,7 @@
             }
         }
     },
-    "revision": "20141006",
+    "revision": "20141008",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/analytics__v3.json b/discovery/googleapis/analytics__v3.json
index e8b0b93..7deb025 100644
--- a/discovery/googleapis/analytics__v3.json
+++ b/discovery/googleapis/analytics__v3.json
@@ -26,10 +26,10 @@
     "description": "View and manage your Google Analytics data",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/analytics/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/SYGRjopRmK4Bczs5VKxKJQKTU8s\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2bkMw2SQFkDhH1qCY3r_qXKtIUI\"",
     "icons": {
-        "x16": "http://www.google.com/images/icons/product/analytics-16.png",
-        "x32": "http://www.google.com/images/icons/product/analytics-32.png"
+        "x16": "https://www.google.com/images/icons/product/analytics-16.png",
+        "x32": "https://www.google.com/images/icons/product/analytics-32.png"
     },
     "id": "analytics:v3",
     "kind": "discovery#restDescription",
@@ -374,7 +374,7 @@
                             "id": "analytics.management.accountSummaries.list",
                             "parameters": {
                                 "max-results": {
-                                    "description": "The maximum number of filters to include in this response.",
+                                    "description": "The maximum number of account summaries to include in this response, where the largest acceptable value is 1000.",
                                     "format": "int32",
                                     "location": "query",
                                     "type": "integer"
@@ -3297,7 +3297,7 @@
             }
         }
     },
-    "revision": "20140723",
+    "revision": "20141013",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
@@ -5356,6 +5356,10 @@
                     "description": "Indicates whether ecommerce tracking is enabled for this view (profile).",
                     "type": "boolean"
                 },
+                "enhancedECommerceTracking": {
+                    "description": "Indicates whether enhanced ecommerce tracking is enabled for this view (profile).",
+                    "type": "boolean"
+                },
                 "excludeQueryParameters": {
                     "description": "The query parameters that are excluded from this view (profile).",
                     "type": "string"
diff --git a/discovery/googleapis/androidpublisher__v2.json b/discovery/googleapis/androidpublisher__v2.json
index bf122ce..e430d9e 100644
--- a/discovery/googleapis/androidpublisher__v2.json
+++ b/discovery/googleapis/androidpublisher__v2.json
@@ -15,7 +15,7 @@
     "description": "Lets Android application developers access their Google Play accounts.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/android-publisher",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/rvEzY_KAgBOlUM1lQqukKQLrl6Y\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/rvEzY_KAgBOlUM1lQqukKQLrl6Y\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/android-16.png",
         "x32": "https://www.google.com/images/icons/product/android-32.png"
diff --git a/discovery/googleapis/appsactivity__v1.json b/discovery/googleapis/appsactivity__v1.json
index 8a0c9b3..3208f9c 100644
--- a/discovery/googleapis/appsactivity__v1.json
+++ b/discovery/googleapis/appsactivity__v1.json
@@ -23,7 +23,7 @@
     "description": "Provides a historical view of activity.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/activity/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/0zYm3U9WhfJU7WORU2EWqKp-P40\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/0zYm3U9WhfJU7WORU2EWqKp-P40\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/appstate__v1.json b/discovery/googleapis/appstate__v1.json
index 7eab544..37c22ce 100644
--- a/discovery/googleapis/appstate__v1.json
+++ b/discovery/googleapis/appstate__v1.json
@@ -15,7 +15,7 @@
     "description": "The Google App State API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/web/api/states",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/0vSygcbXtclKL1_a0ngNpGUkpCM\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/H7n11Hwm4onxnROpOMZpkrylJj8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -211,7 +211,7 @@
             }
         }
     },
-    "revision": "20141002",
+    "revision": "20141005",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "GetResponse": {
diff --git a/discovery/googleapis/bigquery__v2.json b/discovery/googleapis/bigquery__v2.json
index 767b17e..e1983d5 100644
--- a/discovery/googleapis/bigquery__v2.json
+++ b/discovery/googleapis/bigquery__v2.json
@@ -29,7 +29,7 @@
     "description": "A data platform for customers to create, manage, share and query data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/bigquery/docs/overview",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/HuoHzxwZuMSucTevJLq_0v1_DM0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/m8edoc2ZO3cKKMgqC6cKOK0fVjI\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/search-16.gif",
         "x32": "https://www.google.com/images/icons/product/search-32.gif"
@@ -889,7 +889,7 @@
             }
         }
     },
-    "revision": "20140908",
+    "revision": "20141016",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Dataset": {
diff --git a/discovery/googleapis/blogger__v3.json b/discovery/googleapis/blogger__v3.json
index 0660c32..19b9237 100644
--- a/discovery/googleapis/blogger__v3.json
+++ b/discovery/googleapis/blogger__v3.json
@@ -17,7 +17,7 @@
     "description": "API for access to the data within Blogger.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/blogger/docs/3.0/getting_started",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/I7tzOwxkXmchrTG5SGJOMVoYTBw\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/I7tzOwxkXmchrTG5SGJOMVoYTBw\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/blogger-16.png",
         "x32": "https://www.google.com/images/icons/product/blogger-32.png"
diff --git a/discovery/googleapis/books__v1.json b/discovery/googleapis/books__v1.json
index cada26d..466f7a0 100644
--- a/discovery/googleapis/books__v1.json
+++ b/discovery/googleapis/books__v1.json
@@ -14,7 +14,7 @@
     "description": "Lets you search for books and manage your Google Books library.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/books/docs/v1/getting_started",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/XYINYydMW1yxY9sZ7pYYpIG24qI\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/XYINYydMW1yxY9sZ7pYYpIG24qI\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/ebooks-16.png",
         "x32": "http://www.google.com/images/icons/product/ebooks-32.png"
diff --git a/discovery/googleapis/calendar__v3.json b/discovery/googleapis/calendar__v3.json
index a7e716c..401acfd 100644
--- a/discovery/googleapis/calendar__v3.json
+++ b/discovery/googleapis/calendar__v3.json
@@ -17,7 +17,7 @@
     "description": "Lets you manipulate events and other calendar data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/vJn-IbIFOuzj-0Iuor__XCxLfRw\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/kfT5pFWI9VnCK4GzEz7hf4hMjew\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/calendar-16.png",
         "x32": "http://www.google.com/images/icons/product/calendar-32.png"
@@ -1535,7 +1535,7 @@
             }
         }
     },
-    "revision": "20140925",
+    "revision": "20140930",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
diff --git a/discovery/googleapis/civicinfo__us_v1.json b/discovery/googleapis/civicinfo__us_v1.json
index fdd2b08..8e47f5d 100644
--- a/discovery/googleapis/civicinfo__us_v1.json
+++ b/discovery/googleapis/civicinfo__us_v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/WNbUWEmcNA7tbz8oCLk_gd-5NpQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/3_1avFY-y0DJdFQjOVCYJj_vesI\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -162,7 +162,7 @@
             }
         }
     },
-    "revision": "20140814",
+    "revision": "20141013",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
diff --git a/discovery/googleapis/civicinfo__v1.json b/discovery/googleapis/civicinfo__v1.json
index 72a70d8..bc07c38 100644
--- a/discovery/googleapis/civicinfo__v1.json
+++ b/discovery/googleapis/civicinfo__v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/8e9yfjQviGE-Eza63-qXipcXCgI\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/nDJOs8qjoTOd8SXCjEAMl2yYVcQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -162,7 +162,7 @@
             }
         }
     },
-    "revision": "20140814",
+    "revision": "20141013",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
diff --git a/discovery/googleapis/civicinfo__v2.json b/discovery/googleapis/civicinfo__v2.json
index d7b60e0..776c5a9 100644
--- a/discovery/googleapis/civicinfo__v2.json
+++ b/discovery/googleapis/civicinfo__v2.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/YV4QnTSNnV4r4LSJ23wzwsBf0U0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5v6NdAJI6D9bRU7oDGpNoBkCKy8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -301,7 +301,7 @@
             }
         }
     },
-    "revision": "20140814",
+    "revision": "20141013",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
diff --git a/discovery/googleapis/compute__v1.json b/discovery/googleapis/compute__v1.json
index f85aef9..4dd1a7d 100644
--- a/discovery/googleapis/compute__v1.json
+++ b/discovery/googleapis/compute__v1.json
@@ -26,7 +26,7 @@
     "description": "API for the Google Compute Engine service.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/docs/reference/latest/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/qUHCwz70L0xuP-BVWW3HW2bYL8A\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/GzT3QuznikNBeUl_jZ6mEw13u7c\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/compute_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/compute_engine-32.png"
@@ -5289,7 +5289,7 @@
             }
         }
     },
-    "revision": "20141006",
+    "revision": "20141008",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AccessConfig": {
diff --git a/discovery/googleapis/content__v2.json b/discovery/googleapis/content__v2.json
index 4fa1eee..9537aba 100644
--- a/discovery/googleapis/content__v2.json
+++ b/discovery/googleapis/content__v2.json
@@ -15,7 +15,7 @@
     "description": "Manage product items, inventory, and Merchant Center accounts for Google Shopping.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/shopping-content/v2/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/A2XLMVbDZ3wz-BHedDlLhZtYEH4\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/7JtHRkerzIVCOlD80Ybyn4STFoY\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -933,7 +933,7 @@
             }
         }
     },
-    "revision": "20141001",
+    "revision": "20141010",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/coordinate__v1.json b/discovery/googleapis/coordinate__v1.json
index 0370d30..d6ddecd 100644
--- a/discovery/googleapis/coordinate__v1.json
+++ b/discovery/googleapis/coordinate__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you view and manage jobs in a Coordinate team.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/coordinate/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/ckefd3M0PpbhIY5DVZQuUY4ElY0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ckefd3M0PpbhIY5DVZQuUY4ElY0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/customsearch__v1.json b/discovery/googleapis/customsearch__v1.json
index 0ab3101..a8b5acf 100644
--- a/discovery/googleapis/customsearch__v1.json
+++ b/discovery/googleapis/customsearch__v1.json
@@ -5,7 +5,7 @@
     "description": "Lets you search over a website or collection of websites",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/custom-search/v1/using_rest",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/KsgpNVP8dzFmgPzAjDdH7uBJP_M\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/KsgpNVP8dzFmgPzAjDdH7uBJP_M\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/dfareporting__v1.3.json b/discovery/googleapis/dfareporting__v1.3.json
index 5964f1a..b21a1e3 100644
--- a/discovery/googleapis/dfareporting__v1.3.json
+++ b/discovery/googleapis/dfareporting__v1.3.json
@@ -14,7 +14,7 @@
     "description": "Lets you create, run and download reports.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/doubleclick-advertisers/reporting/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/MWMfv6FhKF4U3Z385phCHGvJ6w0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/MWMfv6FhKF4U3Z385phCHGvJ6w0\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/discovery/googleapis/discovery__v1.json b/discovery/googleapis/discovery__v1.json
index 7e26453..b97ccd1 100644
--- a/discovery/googleapis/discovery__v1.json
+++ b/discovery/googleapis/discovery__v1.json
@@ -5,7 +5,7 @@
     "description": "Lets you discover information about other Google APIs, such as what APIs are available, the resource and method details for each API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/discovery/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/UNFMI_ENJ3hAFRWSi4GLSerTeFg\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/UNFMI_ENJ3hAFRWSi4GLSerTeFg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/filing_cabinet_search-g16.png",
         "x32": "http://www.google.com/images/icons/feature/filing_cabinet_search-g32.png"
diff --git a/discovery/googleapis/doubleclickbidmanager__v1.json b/discovery/googleapis/doubleclickbidmanager__v1.json
index ade91b8..5602268 100644
--- a/discovery/googleapis/doubleclickbidmanager__v1.json
+++ b/discovery/googleapis/doubleclickbidmanager__v1.json
@@ -6,7 +6,7 @@
     "description": "API for viewing and managing your reports in DoubleClick Bid Manager.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/bid-manager/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/Xt8yN3tZcmaa98PBixxfMwJ2TF0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/Xt8yN3tZcmaa98PBixxfMwJ2TF0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/doubleclicksearch__v2.json b/discovery/googleapis/doubleclicksearch__v2.json
index 35fe347..12c24bf 100644
--- a/discovery/googleapis/doubleclicksearch__v2.json
+++ b/discovery/googleapis/doubleclicksearch__v2.json
@@ -14,7 +14,7 @@
     "description": "Report and modify your advertising data in DoubleClick Search (for example, campaigns, ad groups, keywords, and conversions).",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/doubleclick-search/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/g6aF7RN46wc-YTVBZvZs-zRkgLA\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/g6aF7RN46wc-YTVBZvZs-zRkgLA\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/drive__v2.json b/discovery/googleapis/drive__v2.json
index c0e2fd1..acb3b32 100644
--- a/discovery/googleapis/drive__v2.json
+++ b/discovery/googleapis/drive__v2.json
@@ -32,7 +32,7 @@
     "description": "The API to interact with Drive.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/drive/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/y7eWP2ztQoapytMeEl_x5nhF6LI\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/8O8WdcLF8cXKLqmsbUzfLValrE8\"",
     "icons": {
         "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png",
         "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png"
@@ -2429,7 +2429,7 @@
             }
         }
     },
-    "revision": "20140923",
+    "revision": "20141009",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "About": {
diff --git a/discovery/googleapis/freebase__v1.json b/discovery/googleapis/freebase__v1.json
index cedd094..f60b108 100644
--- a/discovery/googleapis/freebase__v1.json
+++ b/discovery/googleapis/freebase__v1.json
@@ -5,7 +5,7 @@
     "description": "Find Freebase entities using textual queries and other constraints.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/freebase/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/kTDiVESNLycoqIbveRofH5KPD08\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/kTDiVESNLycoqIbveRofH5KPD08\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/freebase-16.png",
         "x32": "http://www.google.com/images/icons/product/freebase-32.png"
diff --git a/discovery/googleapis/fusiontables__v1.json b/discovery/googleapis/fusiontables__v1.json
index 4930b3f..54d4261 100644
--- a/discovery/googleapis/fusiontables__v1.json
+++ b/discovery/googleapis/fusiontables__v1.json
@@ -17,7 +17,7 @@
     "description": "API for working with Fusion Tables data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/fusiontables",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/2SXcXxFSlQLFOa3jAavYTPdAPrc\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/e6E288d7nM4w6x2Tq0-U44_kHhk\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1127,7 +1127,7 @@
             }
         }
     },
-    "revision": "20140724",
+    "revision": "20141016",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Bucket": {
diff --git a/discovery/googleapis/gamesManagement__v1management.json b/discovery/googleapis/gamesManagement__v1management.json
index 12f6a00..5816f7e 100644
--- a/discovery/googleapis/gamesManagement__v1management.json
+++ b/discovery/googleapis/gamesManagement__v1management.json
@@ -18,7 +18,7 @@
     "description": "The Management API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/IxsRVKhlHvQqb_TC5IIo_pE2aNs\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/x8CnK19Ndg5iWRWLYO9YWdv4nv8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -420,7 +420,7 @@
             }
         }
     },
-    "revision": "20141002",
+    "revision": "20141005",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementResetAllResponse": {
diff --git a/discovery/googleapis/games__v1.json b/discovery/googleapis/games__v1.json
index 08af3e1..d66ea5a 100644
--- a/discovery/googleapis/games__v1.json
+++ b/discovery/googleapis/games__v1.json
@@ -21,7 +21,7 @@
     "description": "The API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/NncFgBJeCrnXAbpnOtRcRiDDkZg\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/BZizlPQP52YM5WPuW178a0ClK98\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1907,7 +1907,7 @@
             }
         }
     },
-    "revision": "20141002",
+    "revision": "20141005",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementDefinition": {
diff --git a/discovery/googleapis/gmail__v1.json b/discovery/googleapis/gmail__v1.json
index fdd6daa..15efe01 100644
--- a/discovery/googleapis/gmail__v1.json
+++ b/discovery/googleapis/gmail__v1.json
@@ -23,7 +23,7 @@
     "description": "The Gmail REST API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/gmail/api/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/FGWIXwFi3bZjyIWUjsVvCy3aEZU\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/VTv_VctBdqXjsksB5IcLu4ps6Nw\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/googlemail-16.png",
         "x32": "https://www.google.com/images/icons/product/googlemail-32.png"
@@ -81,6 +81,35 @@
     "protocol": "rest",
     "resources": {
         "users": {
+            "methods": {
+                "getProfile": {
+                    "description": "Gets the current user's Gmail profile.",
+                    "httpMethod": "GET",
+                    "id": "gmail.users.getProfile",
+                    "parameterOrder": [
+                        "userId"
+                    ],
+                    "parameters": {
+                        "userId": {
+                            "default": "me",
+                            "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "{userId}/profile",
+                    "response": {
+                        "$ref": "Profile"
+                    },
+                    "scopes": [
+                        "https://mail.google.com/",
+                        "https://www.googleapis.com/auth/gmail.compose",
+                        "https://www.googleapis.com/auth/gmail.modify",
+                        "https://www.googleapis.com/auth/gmail.readonly"
+                    ]
+                }
+            },
             "resources": {
                 "drafts": {
                     "methods": {
@@ -1270,7 +1299,7 @@
             }
         }
     },
-    "revision": "20141001",
+    "revision": "20141009",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Draft": {
@@ -1674,6 +1703,32 @@
             },
             "type": "object"
         },
+        "Profile": {
+            "description": "Profile for a Gmail user.",
+            "id": "Profile",
+            "properties": {
+                "emailAddress": {
+                    "description": "The user's email address.",
+                    "type": "string"
+                },
+                "historyId": {
+                    "description": "The ID of the mailbox's current history record.",
+                    "format": "uint64",
+                    "type": "string"
+                },
+                "messagesTotal": {
+                    "description": "The total number of messages in the mailbox.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "threadsTotal": {
+                    "description": "The total number of threads in the mailbox.",
+                    "format": "int32",
+                    "type": "integer"
+                }
+            },
+            "type": "object"
+        },
         "Thread": {
             "description": "A collection of messages representing a conversation.",
             "id": "Thread",
diff --git a/discovery/googleapis/groupsmigration__v1.json b/discovery/googleapis/groupsmigration__v1.json
index 25bfc01..68ef64c 100644
--- a/discovery/googleapis/groupsmigration__v1.json
+++ b/discovery/googleapis/groupsmigration__v1.json
@@ -6,7 +6,7 @@
     "description": "Groups Migration Api.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/groups-migration/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/uMvgRqCygYBIh2d3lXb4f8cUWOw\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/uMvgRqCygYBIh2d3lXb4f8cUWOw\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/discussions-16.gif",
         "x32": "http://www.google.com/images/icons/product/discussions-32.gif"
diff --git a/discovery/googleapis/groupssettings__v1.json b/discovery/googleapis/groupssettings__v1.json
index 6ea18f7..a720e98 100644
--- a/discovery/googleapis/groupssettings__v1.json
+++ b/discovery/googleapis/groupssettings__v1.json
@@ -14,7 +14,7 @@
     "description": "Lets you manage permission levels and related settings of a group.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/groups-settings/get_started",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/-WzKihq8ROq_FQdrGtr_UG9N-4Y\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/-WzKihq8ROq_FQdrGtr_UG9N-4Y\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/identitytoolkit__v3.json b/discovery/googleapis/identitytoolkit__v3.json
index 5ec701f..4a83cef 100644
--- a/discovery/googleapis/identitytoolkit__v3.json
+++ b/discovery/googleapis/identitytoolkit__v3.json
@@ -6,7 +6,7 @@
     "description": "Help the third party sites to implement federated login.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/identity-toolkit/v3/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/zVUSgAlpBKN8kedTmeeniVwh5g4\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/jfVz2w61e7LPgd-72fW_8rrOqOc\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -197,7 +197,7 @@
             }
         }
     },
-    "revision": "20140916",
+    "revision": "20141009",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "CreateAuthUriResponse": {
diff --git a/discovery/googleapis/licensing__v1.json b/discovery/googleapis/licensing__v1.json
index 40cc131..e28d9b3 100644
--- a/discovery/googleapis/licensing__v1.json
+++ b/discovery/googleapis/licensing__v1.json
@@ -5,7 +5,7 @@
     "description": "Licensing API to view and manage license for your domain.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/licensing/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/5nv4m0pBrnwpGqw9jwk2yynQNrg\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/5nv4m0pBrnwpGqw9jwk2yynQNrg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/mapsengine__v1.json b/discovery/googleapis/mapsengine__v1.json
index 4d6ac33..7b4c68f 100644
--- a/discovery/googleapis/mapsengine__v1.json
+++ b/discovery/googleapis/mapsengine__v1.json
@@ -18,7 +18,7 @@
     "description": "The Google Maps Engine API allows developers to store and query geospatial vector and raster data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/maps-engine/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/mIaACfaLFy1GFFH2NY85fbhSr_I\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/qPyTs6YgupnkPPausvgVVCo1k4I\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/maps_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/maps_engine-32.png"
@@ -2796,7 +2796,7 @@
             }
         }
     },
-    "revision": "20141001",
+    "revision": "20141015",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AcquisitionTime": {
@@ -4382,15 +4382,15 @@
             "type": "object"
         },
         "Project": {
-            "description": "A project groups a collection of resources.",
+            "description": "A Maps Engine project groups a collection of resources.",
             "id": "Project",
             "properties": {
                 "id": {
-                    "description": "An ID used to refer to this project.",
+                    "description": "An ID used to refer to this Maps Engine project.",
                     "type": "string"
                 },
                 "name": {
-                    "description": "A user provided name for this project.",
+                    "description": "A user provided name for this Maps Engine project.",
                     "type": "string"
                 }
             },
diff --git a/discovery/googleapis/mirror__v1.json b/discovery/googleapis/mirror__v1.json
index f963bba..9c7ab37 100644
--- a/discovery/googleapis/mirror__v1.json
+++ b/discovery/googleapis/mirror__v1.json
@@ -17,7 +17,7 @@
     "description": "API for interacting with Glass users via the timeline.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/glass",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/x73cpqpFVl1e3xcBp5OSFfItgv0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/qoehHrll3uiPpqLR5D6r-Z7hk4k\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -735,7 +735,7 @@
             }
         }
     },
-    "revision": "20140917",
+    "revision": "20141008",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/oauth2__v2.json b/discovery/googleapis/oauth2__v2.json
index 5100ccb..d0cd5d7 100644
--- a/discovery/googleapis/oauth2__v2.json
+++ b/discovery/googleapis/oauth2__v2.json
@@ -23,7 +23,7 @@
     "description": "Lets you access OAuth2 protocol related APIs.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/accounts/docs/OAuth2",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/GL-dbqdl5oZGNiFahadB80nONis\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/GL-dbqdl5oZGNiFahadB80nONis\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/pagespeedonline__v1.json b/discovery/googleapis/pagespeedonline__v1.json
index d4ecec9..b1a693b 100644
--- a/discovery/googleapis/pagespeedonline__v1.json
+++ b/discovery/googleapis/pagespeedonline__v1.json
@@ -5,7 +5,7 @@
     "description": "Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/speed/docs/insights/v1/getting_started",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/d-8yA-cBFtVSz2k25Ky8r9ibOxE\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/zQ_VmUlOwc6n15qq-vrFuIYN9cQ\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/pagespeed-16.png",
         "x32": "https://www.google.com/images/icons/product/pagespeed-32.png"
@@ -126,7 +126,7 @@
             }
         }
     },
-    "revision": "20140930",
+    "revision": "20141015",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Result": {
diff --git a/discovery/googleapis/plusDomains__v1.json b/discovery/googleapis/plusDomains__v1.json
index 9429ee3..0950e37 100644
--- a/discovery/googleapis/plusDomains__v1.json
+++ b/discovery/googleapis/plusDomains__v1.json
@@ -41,7 +41,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/domains/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/XCskVtSZGHUA2ojjOa7EMJfksm0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/3BJHTEiiNGLBoomkEEIW2R46Cq4\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
@@ -655,6 +655,7 @@
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/plus.login",
+                        "https://www.googleapis.com/auth/plus.me",
                         "https://www.googleapis.com/auth/plus.media.upload"
                     ],
                     "supportsMediaUpload": true
@@ -851,7 +852,7 @@
             }
         }
     },
-    "revision": "20141006",
+    "revision": "20141015",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
diff --git a/discovery/googleapis/plus__v1.json b/discovery/googleapis/plus__v1.json
index 4da45d3..3efc045 100644
--- a/discovery/googleapis/plus__v1.json
+++ b/discovery/googleapis/plus__v1.json
@@ -23,7 +23,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/api/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/b48DqQW2z2Pm99R4F5ulfPmuXVQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/1_HxCi7Wd0T4XNqpdQc_lWD76F4\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
@@ -621,7 +621,7 @@
             }
         }
     },
-    "revision": "20141006",
+    "revision": "20141015",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
diff --git a/discovery/googleapis/prediction__v1.6.json b/discovery/googleapis/prediction__v1.6.json
index 9420762..0a2a98e 100644
--- a/discovery/googleapis/prediction__v1.6.json
+++ b/discovery/googleapis/prediction__v1.6.json
@@ -23,7 +23,7 @@
     "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/prediction/docs/developer-guide",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/MKubU0FmYvcCiak8-htY8xGlT7I\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/MKubU0FmYvcCiak8-htY8xGlT7I\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
         "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
diff --git a/discovery/googleapis/qpxExpress__v1.json b/discovery/googleapis/qpxExpress__v1.json
index 3535af3..d9369b9 100644
--- a/discovery/googleapis/qpxExpress__v1.json
+++ b/discovery/googleapis/qpxExpress__v1.json
@@ -6,7 +6,7 @@
     "description": "Lets you find the least expensive flights between an origin and a destination.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/qpx-express",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/oRXkfQJbU2CyvfsUv40EHopWGd0\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/oRXkfQJbU2CyvfsUv40EHopWGd0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/reseller__v1.json b/discovery/googleapis/reseller__v1.json
index 9d1cb3f..4aa466b 100644
--- a/discovery/googleapis/reseller__v1.json
+++ b/discovery/googleapis/reseller__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you create and manage your customers and their subscriptions.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/reseller/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/WKsRWBQXvzPbkJLogUZV4PnpLRk\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/zxsqVn0Yn5fs87TjHWbdqkRtKVI\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -181,6 +181,36 @@
         },
         "subscriptions": {
             "methods": {
+                "activate": {
+                    "description": "Activates a subscription previously suspended by the reseller",
+                    "httpMethod": "POST",
+                    "id": "reseller.subscriptions.activate",
+                    "parameterOrder": [
+                        "customerId",
+                        "subscriptionId"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Id of the Customer",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "subscriptionId": {
+                            "description": "Id of the subscription, which is unique for a customer",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customers/{customerId}/subscriptions/{subscriptionId}/activate",
+                    "response": {
+                        "$ref": "Subscription"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/apps.order"
+                    ]
+                },
                 "changePlan": {
                     "description": "Changes the plan of a subscription",
                     "httpMethod": "POST",
@@ -458,11 +488,41 @@
                     "scopes": [
                         "https://www.googleapis.com/auth/apps.order"
                     ]
+                },
+                "suspend": {
+                    "description": "Suspends an active subscription",
+                    "httpMethod": "POST",
+                    "id": "reseller.subscriptions.suspend",
+                    "parameterOrder": [
+                        "customerId",
+                        "subscriptionId"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Id of the Customer",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "subscriptionId": {
+                            "description": "Id of the subscription, which is unique for a customer",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customers/{customerId}/subscriptions/{subscriptionId}/suspend",
+                    "response": {
+                        "$ref": "Subscription"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/apps.order"
+                    ]
                 }
             }
         }
     },
-    "revision": "20131109",
+    "revision": "20140821",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Address": {
@@ -598,6 +658,11 @@
                     "description": "Identifies the resource as a subscription change plan request.",
                     "type": "string"
                 },
+                "licensedNumberOfSeats": {
+                    "description": "Read only field containing the current number of licensed seats. Resellers can utilize this field to gather insights into usage for FLEXIBLE Google-Apps subscriptions and other secondary subscriptions (e.g. Google-Vault, Drive-storage).",
+                    "format": "int32",
+                    "type": "integer"
+                },
                 "maximumNumberOfSeats": {
                     "description": "Maximum number of seats that can be purchased. This needs to be provided only for a non-commitment plan. For a commitment plan it is decided by the contract.",
                     "format": "int32",
diff --git a/discovery/googleapis/siteVerification__v1.json b/discovery/googleapis/siteVerification__v1.json
index 3fc0504..4a3fa7a 100644
--- a/discovery/googleapis/siteVerification__v1.json
+++ b/discovery/googleapis/siteVerification__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you programatically verify ownership of websites or domains with Google.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/site-verification/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/RwYHc_wr_RI-M8LU9rCXtGC2FOg\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/RwYHc_wr_RI-M8LU9rCXtGC2FOg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/storage__v1.json b/discovery/googleapis/storage__v1.json
index 439f252..1dd2258 100644
--- a/discovery/googleapis/storage__v1.json
+++ b/discovery/googleapis/storage__v1.json
@@ -2,6 +2,9 @@
     "auth": {
         "oauth2": {
             "scopes": {
+                "https://www.googleapis.com/auth/cloud-platform": {
+                    "description": "View and manage your data across Google Cloud Platform services"
+                },
                 "https://www.googleapis.com/auth/devstorage.full_control": {
                     "description": "Manage your data and permissions in Google Cloud Storage"
                 },
@@ -20,7 +23,7 @@
     "description": "Lets you store and retrieve potentially-large, immutable data objects.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/storage/docs/json_api/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/J4NEKl25SgasPn8QqRPJTF8nCH8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/Q51lUpUSFLOUeZvWamXhAxA0IDI\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
         "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
@@ -287,6 +290,7 @@
                     },
                     "path": "b/{bucket}",
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ]
@@ -336,6 +340,7 @@
                         "$ref": "Bucket"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_only",
                         "https://www.googleapis.com/auth/devstorage.read_write"
@@ -396,6 +401,7 @@
                         "$ref": "Bucket"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ]
@@ -445,6 +451,7 @@
                         "$ref": "Buckets"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_only",
                         "https://www.googleapis.com/auth/devstorage.read_write"
@@ -517,6 +524,7 @@
                         "$ref": "Bucket"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ]
@@ -588,6 +596,7 @@
                         "$ref": "Bucket"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ]
@@ -606,6 +615,7 @@
                         "parameterName": "resource"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_only",
                         "https://www.googleapis.com/auth/devstorage.read_write"
@@ -1120,6 +1130,7 @@
                         "$ref": "Object"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ],
@@ -1257,6 +1268,7 @@
                         "$ref": "Object"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ],
@@ -1316,12 +1328,13 @@
                     },
                     "path": "b/{bucket}/o/{object}",
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ]
                 },
                 "get": {
-                    "description": "Retrieves objects or their metadata.",
+                    "description": "Retrieves an object or its metadata.",
                     "httpMethod": "GET",
                     "id": "storage.objects.get",
                     "parameterOrder": [
@@ -1390,6 +1403,7 @@
                         "$ref": "Object"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_only",
                         "https://www.googleapis.com/auth/devstorage.read_write"
@@ -1502,6 +1516,7 @@
                         "$ref": "Object"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ],
@@ -1568,6 +1583,7 @@
                         "$ref": "Objects"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_only",
                         "https://www.googleapis.com/auth/devstorage.read_write"
@@ -1668,6 +1684,7 @@
                         "$ref": "Object"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ]
@@ -1766,6 +1783,7 @@
                         "$ref": "Object"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_write"
                     ],
@@ -1835,6 +1853,7 @@
                         "$ref": "Channel"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/devstorage.full_control",
                         "https://www.googleapis.com/auth/devstorage.read_only",
                         "https://www.googleapis.com/auth/devstorage.read_write"
@@ -1844,7 +1863,7 @@
             }
         }
     },
-    "revision": "20140911",
+    "revision": "20141010",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Bucket": {
diff --git a/discovery/googleapis/tasks__v1.json b/discovery/googleapis/tasks__v1.json
index cad1f10..3261552 100644
--- a/discovery/googleapis/tasks__v1.json
+++ b/discovery/googleapis/tasks__v1.json
@@ -17,7 +17,7 @@
     "description": "Lets you manage your tasks and task lists.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/tasks/firstapp",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/2OzpktTyb8G1n0lJqDrsLrojoIY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2OzpktTyb8G1n0lJqDrsLrojoIY\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/tasks-16.png",
         "x32": "http://www.google.com/images/icons/product/tasks-32.png"
diff --git a/discovery/googleapis/translate__v2.json b/discovery/googleapis/translate__v2.json
index 39347e8..11ade92 100644
--- a/discovery/googleapis/translate__v2.json
+++ b/discovery/googleapis/translate__v2.json
@@ -5,7 +5,7 @@
     "description": "Lets you translate text from one language to another",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/translate/v2/using_rest",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/x8y0eeapVY09xfAj-RIWaraLUFU\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/x8y0eeapVY09xfAj-RIWaraLUFU\"",
     "features": [
         "dataWrapper"
     ],
diff --git a/discovery/googleapis/urlshortener__v1.json b/discovery/googleapis/urlshortener__v1.json
index bc386eb..bef6c37 100644
--- a/discovery/googleapis/urlshortener__v1.json
+++ b/discovery/googleapis/urlshortener__v1.json
@@ -14,7 +14,7 @@
     "description": "Lets you create, inspect, and manage goo.gl short URLs",
     "discoveryVersion": "v1",
     "documentationLink": "http://code.google.com/apis/urlshortener/v1/getting_started.html",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/T4bB77XUfbpGWn7xKXxC7yFKgeE\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/T4bB77XUfbpGWn7xKXxC7yFKgeE\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis/webfonts__v1.json b/discovery/googleapis/webfonts__v1.json
index cff3575..d4b7ee3 100644
--- a/discovery/googleapis/webfonts__v1.json
+++ b/discovery/googleapis/webfonts__v1.json
@@ -5,7 +5,7 @@
     "description": "The Google Fonts Developer API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/fonts/docs/developer_api",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/uRZcMEbTVS9rWZxqJQOe5kJsXfo\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/uRZcMEbTVS9rWZxqJQOe5kJsXfo\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/font_api-16.png",
         "x32": "http://www.google.com/images/icons/feature/font_api-32.gif"
diff --git a/discovery/googleapis/webmasters__v3.json b/discovery/googleapis/webmasters__v3.json
index b9d2b68..71db4a5 100644
--- a/discovery/googleapis/webmasters__v3.json
+++ b/discovery/googleapis/webmasters__v3.json
@@ -17,7 +17,7 @@
     "description": "Lets you view Google Webmaster Tools data for your verified sites.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/webmaster-tools/v3/welcome",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/sCAxuVQJb4ynjZxsnsm28T2muEw\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/sCAxuVQJb4ynjZxsnsm28T2muEw\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/webmaster_tools-16.png",
         "x32": "https://www.google.com/images/icons/product/webmaster_tools-32.png"
diff --git a/discovery/googleapis/youtubeAnalytics__v1.json b/discovery/googleapis/youtubeAnalytics__v1.json
index 464751a..4a4ac93 100644
--- a/discovery/googleapis/youtubeAnalytics__v1.json
+++ b/discovery/googleapis/youtubeAnalytics__v1.json
@@ -18,7 +18,7 @@
     "description": "Retrieve your YouTube Analytics reports.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/youtube/analytics/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/nlDKGR94Mbaj_YAIBNSZijmIvJQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/nlDKGR94Mbaj_YAIBNSZijmIvJQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/youtube-16.png",
         "x32": "http://www.google.com/images/icons/product/youtube-32.png"
diff --git a/discovery/googleapis/youtube__v3.json b/discovery/googleapis/youtube__v3.json
index 2c4d271..60323e9 100644
--- a/discovery/googleapis/youtube__v3.json
+++ b/discovery/googleapis/youtube__v3.json
@@ -27,7 +27,7 @@
     "description": "Programmatic access to YouTube features.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/youtube/v3",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/AH-IEbavfgCCcxMvonELgSqtbcY\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/AH-IEbavfgCCcxMvonELgSqtbcY\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/youtube-16.png",
         "x32": "https://www.google.com/images/icons/product/youtube-32.png"
diff --git a/discovery/googleapis_beta/autoscaler__v1beta2.json b/discovery/googleapis_beta/autoscaler__v1beta2.json
index d288a18..fa2dc12 100644
--- a/discovery/googleapis_beta/autoscaler__v1beta2.json
+++ b/discovery/googleapis_beta/autoscaler__v1beta2.json
@@ -17,7 +17,7 @@
     "description": "The Google Compute Engine Autoscaler API provides autoscaling for groups of Cloud VMs.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/compute/docs/autoscaler",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/BoJiTEWHJN3oMRPgh3rGgk87M0g\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/mXaVlrmfb2VNKELCD4Zc-7YB4IU\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -440,7 +440,7 @@
             }
         }
     },
-    "revision": "20141001",
+    "revision": "20141013",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Autoscaler": {
diff --git a/discovery/googleapis_beta/cloudmonitoring__v2beta1.json b/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
index f6f8f65..f804d8b 100644
--- a/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
+++ b/discovery/googleapis_beta/cloudmonitoring__v2beta1.json
@@ -15,7 +15,7 @@
     "description": "API for accessing Google Cloud and API monitoring data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-monitoring/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/DmpWCY6_5Z-ZgPj47MTzzMnrFlc\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/I5Av_yaMSSyYMM_MBNIflh0DmG8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -274,7 +274,7 @@
             }
         }
     },
-    "revision": "20140929",
+    "revision": "20141010",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "ListMetricDescriptorsRequest": {
@@ -480,7 +480,7 @@
                     "type": "number"
                 },
                 "end": {
-                    "description": "The interval [start, end] is the time period to which the point's value applies. For gauge metrics, whose values are instantaneous measurements, this interval should be empty (start should equal end). For cumulative metrics (of which deltas and rates are special cases), the interval should be non-empty. Both start and end are RFC 3999 strings.",
+                    "description": "The interval [start, end] is the time period to which the point's value applies. For gauge metrics, whose values are instantaneous measurements, this interval should be empty (start should equal end). For cumulative metrics (of which deltas and rates are special cases), the interval should be non-empty. Both start and end are RFC 3339 strings.",
                     "format": "date-time",
                     "type": "string"
                 },
@@ -490,7 +490,7 @@
                     "type": "string"
                 },
                 "start": {
-                    "description": "The interval [start, end] is the time period to which the point's value applies. For gauge metrics, whose values are instantaneous measurements, this interval should be empty (start should equal end). For cumulative metrics (of which deltas and rates are special cases), the interval should be non-empty. Both start and end are RFC 3999 strings.",
+                    "description": "The interval [start, end] is the time period to which the point's value applies. For gauge metrics, whose values are instantaneous measurements, this interval should be empty (start should equal end). For cumulative metrics (of which deltas and rates are special cases), the interval should be non-empty. Both start and end are RFC 3339 strings.",
                     "format": "date-time",
                     "type": "string"
                 },
@@ -606,7 +606,7 @@
                         "description": "The label's name.",
                         "type": "string"
                     },
-                    "description": "The set of key-value pairs that describe this time series, including target-specific labels and metric-specific labels.",
+                    "description": "The label's name.",
                     "type": "object"
                 },
                 "metric": {
@@ -619,6 +619,20 @@
                 }
             },
             "type": "object"
+        },
+        "TimeseriesDescriptorLabel": {
+            "id": "TimeseriesDescriptorLabel",
+            "properties": {
+                "key": {
+                    "description": "The label's name.",
+                    "type": "string"
+                },
+                "value": {
+                    "description": "The label's value.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
         }
     },
     "servicePath": "cloudmonitoring/v2beta1/projects/",
diff --git a/discovery/googleapis_beta/datastore__v1beta2.json b/discovery/googleapis_beta/datastore__v1beta2.json
index 186143c..099c450 100644
--- a/discovery/googleapis_beta/datastore__v1beta2.json
+++ b/discovery/googleapis_beta/datastore__v1beta2.json
@@ -20,7 +20,7 @@
     "description": "API for accessing Google Cloud Datastore.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/datastore/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/LDhSkY4UxrCPhfQmh9G4U2uaRlU\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/LDhSkY4UxrCPhfQmh9G4U2uaRlU\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/dns__v1beta1.json b/discovery/googleapis_beta/dns__v1beta1.json
index 94d20fb..1db9349 100644
--- a/discovery/googleapis_beta/dns__v1beta1.json
+++ b/discovery/googleapis_beta/dns__v1beta1.json
@@ -20,7 +20,7 @@
     "description": "The Google Cloud DNS API provides services for configuring and serving authoritative DNS records.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-dns",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/8dmWjBwqXLQv5ILN4PEcDad3Jq8\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/8dmWjBwqXLQv5ILN4PEcDad3Jq8\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/genomics__v1beta.json b/discovery/googleapis_beta/genomics__v1beta.json
index 3da8da5..18b851a 100644
--- a/discovery/googleapis_beta/genomics__v1beta.json
+++ b/discovery/googleapis_beta/genomics__v1beta.json
@@ -23,7 +23,7 @@
     "description": "Provides access to Genomics data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/genomics/v1beta/reference",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/KuyG9Uj3SRA52u3K-KvNS1fR_Xw\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/QFkFkv2LMi0ob1p4dyYfQYJIVYc\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -330,7 +330,7 @@
                             "type": "string"
                         },
                         "projectId": {
-                            "description": "Only return datasets which belong to this Google Developers Console project. Only accepts project numbers.",
+                            "description": "Only return datasets which belong to this Google Developers Console project. Only accepts project numbers. Returns all public projects if no project number is specified.",
                             "format": "int64",
                             "location": "query",
                             "type": "string"
@@ -946,6 +946,32 @@
                         "$ref": "MergeVariantsRequest"
                     }
                 },
+                "patch": {
+                    "description": "Updates a variant set's metadata. All other modifications are silently ignored. Returns the modified variant set. This method supports patch semantics.",
+                    "httpMethod": "PATCH",
+                    "id": "genomics.variantsets.patch",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "The ID of the variant to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "request": {
+                        "$ref": "VariantSet"
+                    },
+                    "response": {
+                        "$ref": "VariantSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
                 "search": {
                     "description": "Returns a list of all variant sets matching search criteria.",
                     "httpMethod": "POST",
@@ -961,11 +987,37 @@
                         "https://www.googleapis.com/auth/genomics",
                         "https://www.googleapis.com/auth/genomics.readonly"
                     ]
+                },
+                "update": {
+                    "description": "Updates a variant set's metadata. All other modifications are silently ignored. Returns the modified variant set.",
+                    "httpMethod": "PUT",
+                    "id": "genomics.variantsets.update",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "The ID of the variant to be updated.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "request": {
+                        "$ref": "VariantSet"
+                    },
+                    "response": {
+                        "$ref": "VariantSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
                 }
             }
         }
     },
-    "revision": "20141001",
+    "revision": "20141015",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Beacon": {
@@ -1108,7 +1160,7 @@
             "type": "object"
         },
         "ExperimentalCreateJobRequest": {
-            "description": "The job creation request. Next ID: 12",
+            "description": "The job creation request.",
             "id": "ExperimentalCreateJobRequest",
             "properties": {
                 "align": {
@@ -1123,10 +1175,6 @@
                     "description": "Specifies where to copy the results of certain pipelines. This should be in the form of gs://bucket/path.",
                     "type": "string"
                 },
-                "libraryName": {
-                    "description": "For alignment from FASTQ files, this specifies the library name.",
-                    "type": "string"
-                },
                 "pairedSourceUris": {
                     "description": "A list of Google Cloud Storage URIs of paired end .fastq files to operate upon. If specified, this represents the second file of each paired .fastq file. The first file of each pair should be specified in sourceUris.",
                     "items": {
@@ -1134,27 +1182,11 @@
                     },
                     "type": "array"
                 },
-                "platformName": {
-                    "description": "For alignment from FASTQ files, this specifies the platform name.",
-                    "type": "string"
-                },
-                "platformUnit": {
-                    "description": "For alignment from FASTQ files, this specifies the platform unit.",
-                    "type": "string"
-                },
                 "projectId": {
                     "description": "Required. The Google Cloud Project ID with which to associate the request.",
                     "format": "int64",
                     "type": "string"
                 },
-                "readGroupId": {
-                    "description": "For alignment from FASTQ files, this specifies the read group ID.",
-                    "type": "string"
-                },
-                "sampleName": {
-                    "description": "For alignment from FASTQ files, this specifies the sample name.",
-                    "type": "string"
-                },
                 "sourceUris": {
                     "description": "A list of Google Cloud Storage URIs of data files to operate upon. These can be .bam, interleaved .fastq, or paired .fastq. If specifying paired .fastq files, the first of each pair of files should be listed here, and the second of each pair should be listed in pairedSourceUris.",
                     "items": {
diff --git a/discovery/googleapis_beta/manager__v1beta2.json b/discovery/googleapis_beta/manager__v1beta2.json
index 316b16d..87431ef 100644
--- a/discovery/googleapis_beta/manager__v1beta2.json
+++ b/discovery/googleapis_beta/manager__v1beta2.json
@@ -29,7 +29,7 @@
     "description": "The Deployment Manager API allows users to declaratively configure, deploy and run complex solutions on the Google Cloud Platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/deployment-manager/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/iGUA1MFJvjag5CPQwb2aT371UTs\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/iGUA1MFJvjag5CPQwb2aT371UTs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/pubsub__v1beta1.json b/discovery/googleapis_beta/pubsub__v1beta1.json
index 34c0af0..e44aa60 100644
--- a/discovery/googleapis_beta/pubsub__v1beta1.json
+++ b/discovery/googleapis_beta/pubsub__v1beta1.json
@@ -17,7 +17,7 @@
     "description": "Provides reliable, many-to-many, asynchronous messaging between applications.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/pubsub/v1beta1",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/ywePitQXGabB9vHcCh_sNtCXjDU\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ywePitQXGabB9vHcCh_sNtCXjDU\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/search-16.gif",
         "x32": "https://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/replicapool__v1beta1.json b/discovery/googleapis_beta/replicapool__v1beta1.json
index 57addac..d07de73 100644
--- a/discovery/googleapis_beta/replicapool__v1beta1.json
+++ b/discovery/googleapis_beta/replicapool__v1beta1.json
@@ -26,7 +26,7 @@
     "description": "The Replica Pool API allows users to declaratively provision and manage groups of Google Compute Engine instances based on a common template.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/docs/replica-pool/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/OCNWVpxMyrgI9AhJbRIevULm13s\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/OCNWVpxMyrgI9AhJbRIevULm13s\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/resourceviews__v1beta1.json b/discovery/googleapis_beta/resourceviews__v1beta1.json
index 40791db..aaadcbe 100644
--- a/discovery/googleapis_beta/resourceviews__v1beta1.json
+++ b/discovery/googleapis_beta/resourceviews__v1beta1.json
@@ -26,7 +26,7 @@
     "description": "The Resource View API allows users to create and manage logical sets of Google Compute Engine instances.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/2oa8SMSfpFS6UKNS3wRm4F3v1wQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/2oa8SMSfpFS6UKNS3wRm4F3v1wQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/resourceviews__v1beta2.json b/discovery/googleapis_beta/resourceviews__v1beta2.json
index f91b849..d1d1e8c 100644
--- a/discovery/googleapis_beta/resourceviews__v1beta2.json
+++ b/discovery/googleapis_beta/resourceviews__v1beta2.json
@@ -26,7 +26,7 @@
     "description": "The Resource View API allows users to create and manage logical sets of Google Compute Engine instances.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/h07P0KWaqrcoR1sKo_9XnasKmIs\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/h07P0KWaqrcoR1sKo_9XnasKmIs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/sqladmin__v1beta3.json b/discovery/googleapis_beta/sqladmin__v1beta3.json
index cd27715..fe96414 100644
--- a/discovery/googleapis_beta/sqladmin__v1beta3.json
+++ b/discovery/googleapis_beta/sqladmin__v1beta3.json
@@ -18,7 +18,7 @@
     "description": "API for Cloud SQL database instance management.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-sql/docs/admin-api/",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/9fwQA8H2k5NmzsvEUWIyM_KlxbQ\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/9fwQA8H2k5NmzsvEUWIyM_KlxbQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/discovery/googleapis_beta/taskqueue__v1beta2.json b/discovery/googleapis_beta/taskqueue__v1beta2.json
index 1ff62e4..1b4172c 100644
--- a/discovery/googleapis_beta/taskqueue__v1beta2.json
+++ b/discovery/googleapis_beta/taskqueue__v1beta2.json
@@ -17,7 +17,7 @@
     "description": "Lets you access a Google App Engine Pull Task Queue over REST.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/appengine/docs/python/taskqueue/rest",
-    "etag": "\"8MqRhZzx1kw0pwpjahVJEB3eI6w/NdbJrHMoZLPwtpKFHEyZMJzpuTM\"",
+    "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/NdbJrHMoZLPwtpKFHEyZMJzpuTM\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/app_engine-16.png",
         "x32": "http://www.google.com/images/icons/product/app_engine-32.png"
diff --git a/generated/googleapis/CHANGELOG.md b/generated/googleapis/CHANGELOG.md
index b99c28f..5aea4eb 100644
--- a/generated/googleapis/CHANGELOG.md
+++ b/generated/googleapis/CHANGELOG.md
@@ -1,8 +1,16 @@
+## 0.3.1
+
+* [apis] admin_directory:v1: additional schema/methods
+* [apis] analytics:v3: additional schemas/methods
+* [apis] gmail:v1: additional schemas/methods
+* [apis] reseller:v1: additional schemas/methods
+
 ## 0.3.0
 
 * [apis-removed] orkut:v2: removed (Orkut is shut down)
 * [apis] compute:v1: additional schemas/methods
 * [apis] doubleclicksearch:v2: schema changes
+* [apis] games:v1: schema changes
 * [apis] gamesManagement:v1management: schema changes
 * [apis] gmail:v1: schema changes
 
diff --git a/generated/googleapis/README.md b/generated/googleapis/README.md
index c615c26..835262b 100644
--- a/generated/googleapis/README.md
+++ b/generated/googleapis/README.md
@@ -107,7 +107,7 @@
 
 Official API documentation: https://developers.google.com/adsense/host/
 
-#### ![Logo](http://www.google.com/images/icons/product/analytics-16.png) Google Analytics API - analytics v3
+#### ![Logo](https://www.google.com/images/icons/product/analytics-16.png) Google Analytics API - analytics v3
 
 View and manage your Google Analytics data
 
diff --git a/generated/googleapis/lib/admin/directory_v1.dart b/generated/googleapis/lib/admin/directory_v1.dart
index f31570d..e39015b 100644
--- a/generated/googleapis/lib/admin/directory_v1.dart
+++ b/generated/googleapis/lib/admin/directory_v1.dart
@@ -3963,6 +3963,39 @@
 
 
 /** Not documented yet. */
+class ChromeOsDeviceActiveTimeRanges {
+  /** Duration in milliseconds */
+  core.int activeTime;
+
+  /** Date of usage */
+  core.DateTime date;
+
+
+  ChromeOsDeviceActiveTimeRanges();
+
+  ChromeOsDeviceActiveTimeRanges.fromJson(core.Map _json) {
+    if (_json.containsKey("activeTime")) {
+      activeTime = _json["activeTime"];
+    }
+    if (_json.containsKey("date")) {
+      date = core.DateTime.parse(_json["date"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (activeTime != null) {
+      _json["activeTime"] = activeTime;
+    }
+    if (date != null) {
+      _json["date"] = "${(date).year.toString().padLeft(4, '0')}-${(date).month.toString().padLeft(2, '0')}-${(date).day.toString().padLeft(2, '0')}";
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
 class ChromeOsDeviceRecentUsers {
   /** Email address of the user. Present only if the user type is managed */
   core.String email;
@@ -3997,6 +4030,9 @@
 
 /** JSON template for Chrome Os Device resource in Directory API. */
 class ChromeOsDevice {
+  /** List of active time ranges (Read-only) */
+  core.List<ChromeOsDeviceActiveTimeRanges> activeTimeRanges;
+
   /** Address or location of the device as noted by the administrator */
   core.String annotatedLocation;
 
@@ -4079,6 +4115,9 @@
   ChromeOsDevice();
 
   ChromeOsDevice.fromJson(core.Map _json) {
+    if (_json.containsKey("activeTimeRanges")) {
+      activeTimeRanges = _json["activeTimeRanges"].map((value) => new ChromeOsDeviceActiveTimeRanges.fromJson(value)).toList();
+    }
     if (_json.containsKey("annotatedLocation")) {
       annotatedLocation = _json["annotatedLocation"];
     }
@@ -4152,6 +4191,9 @@
 
   core.Map toJson() {
     var _json = new core.Map();
+    if (activeTimeRanges != null) {
+      _json["activeTimeRanges"] = activeTimeRanges.map((value) => (value).toJson()).toList();
+    }
     if (annotatedLocation != null) {
       _json["annotatedLocation"] = annotatedLocation;
     }
diff --git a/generated/googleapis/lib/analytics/v3.dart b/generated/googleapis/lib/analytics/v3.dart
index 7fcd246..ce44a1b 100644
--- a/generated/googleapis/lib/analytics/v3.dart
+++ b/generated/googleapis/lib/analytics/v3.dart
@@ -449,7 +449,8 @@
    *
    * Request parameters:
    *
-   * [max_results] - The maximum number of filters to include in this response.
+   * [max_results] - The maximum number of account summaries to include in this
+   * response, where the largest acceptable value is 1000.
    *
    * [start_index] - An index of the first entity to retrieve. Use this
    * parameter as a pagination mechanism along with the max-results parameter.
@@ -9381,6 +9382,12 @@
    */
   core.bool eCommerceTracking;
 
+  /**
+   * Indicates whether enhanced ecommerce tracking is enabled for this view
+   * (profile).
+   */
+  core.bool enhancedECommerceTracking;
+
   /** The query parameters that are excluded from this view (profile). */
   core.String excludeQueryParameters;
 
@@ -9469,6 +9476,9 @@
     if (_json.containsKey("eCommerceTracking")) {
       eCommerceTracking = _json["eCommerceTracking"];
     }
+    if (_json.containsKey("enhancedECommerceTracking")) {
+      enhancedECommerceTracking = _json["enhancedECommerceTracking"];
+    }
     if (_json.containsKey("excludeQueryParameters")) {
       excludeQueryParameters = _json["excludeQueryParameters"];
     }
@@ -9542,6 +9552,9 @@
     if (eCommerceTracking != null) {
       _json["eCommerceTracking"] = eCommerceTracking;
     }
+    if (enhancedECommerceTracking != null) {
+      _json["enhancedECommerceTracking"] = enhancedECommerceTracking;
+    }
     if (excludeQueryParameters != null) {
       _json["excludeQueryParameters"] = excludeQueryParameters;
     }
diff --git a/generated/googleapis/lib/gmail/v1.dart b/generated/googleapis/lib/gmail/v1.dart
index b49f307..777f81a 100644
--- a/generated/googleapis/lib/gmail/v1.dart
+++ b/generated/googleapis/lib/gmail/v1.dart
@@ -49,6 +49,48 @@
 
   UsersResourceApi(common_internal.ApiRequester client) : 
       _requester = client;
+
+  /**
+   * Gets the current user's Gmail profile.
+   *
+   * Request parameters:
+   *
+   * [userId] - The user's email address. The special value me can be used to
+   * indicate the authenticated user.
+   *
+   * Completes with a [Profile].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Profile> getProfile(core.String userId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (userId == null) {
+      throw new core.ArgumentError("Parameter userId is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$userId') + '/profile';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Profile.fromJson(data));
+  }
+
 }
 
 
@@ -2421,6 +2463,57 @@
 }
 
 
+/** Profile for a Gmail user. */
+class Profile {
+  /** The user's email address. */
+  core.String emailAddress;
+
+  /** The ID of the mailbox's current history record. */
+  core.String historyId;
+
+  /** The total number of messages in the mailbox. */
+  core.int messagesTotal;
+
+  /** The total number of threads in the mailbox. */
+  core.int threadsTotal;
+
+
+  Profile();
+
+  Profile.fromJson(core.Map _json) {
+    if (_json.containsKey("emailAddress")) {
+      emailAddress = _json["emailAddress"];
+    }
+    if (_json.containsKey("historyId")) {
+      historyId = _json["historyId"];
+    }
+    if (_json.containsKey("messagesTotal")) {
+      messagesTotal = _json["messagesTotal"];
+    }
+    if (_json.containsKey("threadsTotal")) {
+      threadsTotal = _json["threadsTotal"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (emailAddress != null) {
+      _json["emailAddress"] = emailAddress;
+    }
+    if (historyId != null) {
+      _json["historyId"] = historyId;
+    }
+    if (messagesTotal != null) {
+      _json["messagesTotal"] = messagesTotal;
+    }
+    if (threadsTotal != null) {
+      _json["threadsTotal"] = threadsTotal;
+    }
+    return _json;
+  }
+}
+
+
 /** A collection of messages representing a conversation. */
 class Thread {
   /** The ID of the last history record that modified this thread. */
diff --git a/generated/googleapis/lib/mapsengine/v1.dart b/generated/googleapis/lib/mapsengine/v1.dart
index 4e4775d..9ed63aa 100644
--- a/generated/googleapis/lib/mapsengine/v1.dart
+++ b/generated/googleapis/lib/mapsengine/v1.dart
@@ -7203,12 +7203,12 @@
 }
 
 
-/** A project groups a collection of resources. */
+/** A Maps Engine project groups a collection of resources. */
 class Project {
-  /** An ID used to refer to this project. */
+  /** An ID used to refer to this Maps Engine project. */
   core.String id;
 
-  /** A user provided name for this project. */
+  /** A user provided name for this Maps Engine project. */
   core.String name;
 
 
diff --git a/generated/googleapis/lib/reseller/v1.dart b/generated/googleapis/lib/reseller/v1.dart
index 316cf25..6d16975 100644
--- a/generated/googleapis/lib/reseller/v1.dart
+++ b/generated/googleapis/lib/reseller/v1.dart
@@ -228,6 +228,51 @@
       _requester = client;
 
   /**
+   * Activates a subscription previously suspended by the reseller
+   *
+   * Request parameters:
+   *
+   * [customerId] - Id of the Customer
+   *
+   * [subscriptionId] - Id of the subscription, which is unique for a customer
+   *
+   * Completes with a [Subscription].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Subscription> activate(core.String customerId, core.String subscriptionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+    if (subscriptionId == null) {
+      throw new core.ArgumentError("Parameter subscriptionId is required.");
+    }
+
+
+    _url = 'customers/' + common_internal.Escaper.ecapeVariable('$customerId') + '/subscriptions/' + common_internal.Escaper.ecapeVariable('$subscriptionId') + '/activate';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Subscription.fromJson(data));
+  }
+
+  /**
    * Changes the plan of a subscription
    *
    * [request] - The metadata request object.
@@ -640,6 +685,51 @@
     return _response.then((data) => new Subscription.fromJson(data));
   }
 
+  /**
+   * Suspends an active subscription
+   *
+   * Request parameters:
+   *
+   * [customerId] - Id of the Customer
+   *
+   * [subscriptionId] - Id of the subscription, which is unique for a customer
+   *
+   * Completes with a [Subscription].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Subscription> suspend(core.String customerId, core.String subscriptionId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+    if (subscriptionId == null) {
+      throw new core.ArgumentError("Parameter subscriptionId is required.");
+    }
+
+
+    _url = 'customers/' + common_internal.Escaper.ecapeVariable('$customerId') + '/subscriptions/' + common_internal.Escaper.ecapeVariable('$subscriptionId') + '/suspend';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Subscription.fromJson(data));
+  }
+
 }
 
 
@@ -926,6 +1016,14 @@
   core.String kind;
 
   /**
+   * Read only field containing the current number of licensed seats. Resellers
+   * can utilize this field to gather insights into usage for FLEXIBLE
+   * Google-Apps subscriptions and other secondary subscriptions (e.g.
+   * Google-Vault, Drive-storage).
+   */
+  core.int licensedNumberOfSeats;
+
+  /**
    * Maximum number of seats that can be purchased. This needs to be provided
    * only for a non-commitment plan. For a commitment plan it is decided by the
    * contract.
@@ -944,6 +1042,9 @@
     if (_json.containsKey("kind")) {
       kind = _json["kind"];
     }
+    if (_json.containsKey("licensedNumberOfSeats")) {
+      licensedNumberOfSeats = _json["licensedNumberOfSeats"];
+    }
     if (_json.containsKey("maximumNumberOfSeats")) {
       maximumNumberOfSeats = _json["maximumNumberOfSeats"];
     }
@@ -957,6 +1058,9 @@
     if (kind != null) {
       _json["kind"] = kind;
     }
+    if (licensedNumberOfSeats != null) {
+      _json["licensedNumberOfSeats"] = licensedNumberOfSeats;
+    }
     if (maximumNumberOfSeats != null) {
       _json["maximumNumberOfSeats"] = maximumNumberOfSeats;
     }
diff --git a/generated/googleapis/lib/src/common_internal.dart b/generated/googleapis/lib/src/common_internal.dart
index 48064ef..829b364 100644
--- a/generated/googleapis/lib/src/common_internal.dart
+++ b/generated/googleapis/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis/0.3.0';
+    'google-api-dart-client googleapis/0.3.1';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
diff --git a/generated/googleapis/lib/storage/v1.dart b/generated/googleapis/lib/storage/v1.dart
index a9fe572..fd3d98b 100644
--- a/generated/googleapis/lib/storage/v1.dart
+++ b/generated/googleapis/lib/storage/v1.dart
@@ -15,6 +15,9 @@
 
 /** Lets you store and retrieve potentially-large, immutable data objects. */
 class StorageApi {
+  /** View and manage your data across Google Cloud Platform services */
+  static const CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform";
+
   /** Manage your data and permissions in Google Cloud Storage */
   static const DevstorageFullControlScope = "https://www.googleapis.com/auth/devstorage.full_control";
 
@@ -1804,7 +1807,7 @@
   }
 
   /**
-   * Retrieves objects or their metadata.
+   * Retrieves an object or its metadata.
    *
    * Request parameters:
    *
diff --git a/generated/googleapis/pubspec.yaml b/generated/googleapis/pubspec.yaml
index bf96b4e..5690b44 100644
--- a/generated/googleapis/pubspec.yaml
+++ b/generated/googleapis/pubspec.yaml
@@ -1,5 +1,5 @@
 name: googleapis
-version: 0.3.0
+version: 0.3.1
 author: Dart Team <misc@dartlang.org>
 description: "Auto-generated client libraries for accessing the following APIs:adexchangebuyer:v1.3, adexchangeseller:v1.1, adexchangeseller:v2.0, admin:directory_v1, admin:email_migration_v2, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, androidpublisher:v2, appsactivity:v1, appstate:v1, bigquery:v2, blogger:v3, books:v1, calendar:v3, civicinfo:us_v1, civicinfo:v1, civicinfo:v2, compute:v1, content:v2, coordinate:v1, customsearch:v1, dfareporting:v1.3, discovery:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, freebase:v1, fusiontables:v1, games:v1, gamesManagement:v1management, gmail:v1, groupsmigration:v1, groupssettings:v1, identitytoolkit:v3, licensing:v1, mapsengine:v1, mirror:v1, oauth2:v2, pagespeedonline:v1, plus:v1, plusDomains:v1, prediction:v1.6, qpxExpress:v1, reseller:v1, siteVerification:v1, storage:v1, tasks:v1, translate:v2, urlshortener:v1, webfonts:v1, webmasters:v3, youtube:v3, youtubeAnalytics:v1"
 homepage: http://www.dartlang.org/googleapis/
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index e462ad5..b28a287 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccountBidderLocation--;
 }
 
-buildUnnamed630() {
+buildUnnamed548() {
   var o = new core.List<api.AccountBidderLocation>();
   o.add(buildAccountBidderLocation());
   o.add(buildAccountBidderLocation());
   return o;
 }
 
-checkUnnamed630(core.List<api.AccountBidderLocation> o) {
+checkUnnamed548(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountBidderLocation(o[0]);
   checkAccountBidderLocation(o[1]);
@@ -57,7 +57,7 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.bidderLocation = buildUnnamed630();
+    o.bidderLocation = buildUnnamed548();
     o.cookieMatchingNid = "foo";
     o.cookieMatchingUrl = "foo";
     o.id = 42;
@@ -71,7 +71,7 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed630(o.bidderLocation);
+    checkUnnamed548(o.bidderLocation);
     unittest.expect(o.cookieMatchingNid, unittest.equals('foo'));
     unittest.expect(o.cookieMatchingUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
@@ -81,14 +81,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed631() {
+buildUnnamed549() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed631(core.List<api.Account> o) {
+checkUnnamed549(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -99,7 +99,7 @@
   var o = new api.AccountsList();
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    o.items = buildUnnamed631();
+    o.items = buildUnnamed549();
     o.kind = "foo";
   }
   buildCounterAccountsList--;
@@ -109,20 +109,20 @@
 checkAccountsList(api.AccountsList o) {
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    checkUnnamed631(o.items);
+    checkUnnamed549(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsList--;
 }
 
-buildUnnamed632() {
+buildUnnamed550() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed632(core.List<core.String> o) {
+checkUnnamed550(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -135,7 +135,7 @@
   if (buildCounterBillingInfo < 3) {
     o.accountId = 42;
     o.accountName = "foo";
-    o.billingId = buildUnnamed632();
+    o.billingId = buildUnnamed550();
     o.kind = "foo";
   }
   buildCounterBillingInfo--;
@@ -147,20 +147,20 @@
   if (buildCounterBillingInfo < 3) {
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.accountName, unittest.equals('foo'));
-    checkUnnamed632(o.billingId);
+    checkUnnamed550(o.billingId);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfo--;
 }
 
-buildUnnamed633() {
+buildUnnamed551() {
   var o = new core.List<api.BillingInfo>();
   o.add(buildBillingInfo());
   o.add(buildBillingInfo());
   return o;
 }
 
-checkUnnamed633(core.List<api.BillingInfo> o) {
+checkUnnamed551(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingInfo(o[0]);
   checkBillingInfo(o[1]);
@@ -171,7 +171,7 @@
   var o = new api.BillingInfoList();
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    o.items = buildUnnamed633();
+    o.items = buildUnnamed551();
     o.kind = "foo";
   }
   buildCounterBillingInfoList--;
@@ -181,59 +181,59 @@
 checkBillingInfoList(api.BillingInfoList o) {
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    checkUnnamed633(o.items);
+    checkUnnamed551(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfoList--;
 }
 
-buildUnnamed634() {
+buildUnnamed552() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed634(core.List<core.String> o) {
+checkUnnamed552(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed635() {
+buildUnnamed553() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed635(core.List<core.int> o) {
+checkUnnamed553(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed636() {
+buildUnnamed554() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed636(core.List<core.String> o) {
+checkUnnamed554(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed637() {
+buildUnnamed555() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed637(core.List<core.String> o) {
+checkUnnamed555(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -244,7 +244,7 @@
   var o = new api.CreativeCorrections();
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    o.details = buildUnnamed637();
+    o.details = buildUnnamed555();
     o.reason = "foo";
   }
   buildCounterCreativeCorrections--;
@@ -254,33 +254,33 @@
 checkCreativeCorrections(api.CreativeCorrections o) {
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    checkUnnamed637(o.details);
+    checkUnnamed555(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeCorrections--;
 }
 
-buildUnnamed638() {
+buildUnnamed556() {
   var o = new core.List<api.CreativeCorrections>();
   o.add(buildCreativeCorrections());
   o.add(buildCreativeCorrections());
   return o;
 }
 
-checkUnnamed638(core.List<api.CreativeCorrections> o) {
+checkUnnamed556(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCorrections(o[0]);
   checkCreativeCorrections(o[1]);
 }
 
-buildUnnamed639() {
+buildUnnamed557() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed639(core.List<core.String> o) {
+checkUnnamed557(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -291,7 +291,7 @@
   var o = new api.CreativeDisapprovalReasons();
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    o.details = buildUnnamed639();
+    o.details = buildUnnamed557();
     o.reason = "foo";
   }
   buildCounterCreativeDisapprovalReasons--;
@@ -301,20 +301,20 @@
 checkCreativeDisapprovalReasons(api.CreativeDisapprovalReasons o) {
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    checkUnnamed639(o.details);
+    checkUnnamed557(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeDisapprovalReasons--;
 }
 
-buildUnnamed640() {
+buildUnnamed558() {
   var o = new core.List<api.CreativeDisapprovalReasons>();
   o.add(buildCreativeDisapprovalReasons());
   o.add(buildCreativeDisapprovalReasons());
   return o;
 }
 
-checkUnnamed640(core.List<api.CreativeDisapprovalReasons> o) {
+checkUnnamed558(core.List<api.CreativeDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeDisapprovalReasons(o[0]);
   checkCreativeDisapprovalReasons(o[1]);
@@ -341,14 +341,14 @@
   buildCounterCreativeFilteringReasonsReasons--;
 }
 
-buildUnnamed641() {
+buildUnnamed559() {
   var o = new core.List<api.CreativeFilteringReasonsReasons>();
   o.add(buildCreativeFilteringReasonsReasons());
   o.add(buildCreativeFilteringReasonsReasons());
   return o;
 }
 
-checkUnnamed641(core.List<api.CreativeFilteringReasonsReasons> o) {
+checkUnnamed559(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFilteringReasonsReasons(o[0]);
   checkCreativeFilteringReasonsReasons(o[1]);
@@ -360,7 +360,7 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     o.date = "foo";
-    o.reasons = buildUnnamed641();
+    o.reasons = buildUnnamed559();
   }
   buildCounterCreativeFilteringReasons--;
   return o;
@@ -370,58 +370,58 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     unittest.expect(o.date, unittest.equals('foo'));
-    checkUnnamed641(o.reasons);
+    checkUnnamed559(o.reasons);
   }
   buildCounterCreativeFilteringReasons--;
 }
 
-buildUnnamed642() {
+buildUnnamed560() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed642(core.List<core.int> o) {
+checkUnnamed560(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed643() {
+buildUnnamed561() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed643(core.List<core.int> o) {
+checkUnnamed561(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed644() {
+buildUnnamed562() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed644(core.List<core.int> o) {
+checkUnnamed562(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed645() {
+buildUnnamed563() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed645(core.List<core.int> o) {
+checkUnnamed563(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -434,22 +434,22 @@
   if (buildCounterCreative < 3) {
     o.HTMLSnippet = "foo";
     o.accountId = 42;
-    o.advertiserId = buildUnnamed634();
+    o.advertiserId = buildUnnamed552();
     o.advertiserName = "foo";
     o.agencyId = "foo";
-    o.attribute = buildUnnamed635();
+    o.attribute = buildUnnamed553();
     o.buyerCreativeId = "foo";
-    o.clickThroughUrl = buildUnnamed636();
-    o.corrections = buildUnnamed638();
-    o.disapprovalReasons = buildUnnamed640();
+    o.clickThroughUrl = buildUnnamed554();
+    o.corrections = buildUnnamed556();
+    o.disapprovalReasons = buildUnnamed558();
     o.filteringReasons = buildCreativeFilteringReasons();
     o.height = 42;
     o.kind = "foo";
-    o.productCategories = buildUnnamed642();
-    o.restrictedCategories = buildUnnamed643();
-    o.sensitiveCategories = buildUnnamed644();
+    o.productCategories = buildUnnamed560();
+    o.restrictedCategories = buildUnnamed561();
+    o.sensitiveCategories = buildUnnamed562();
     o.status = "foo";
-    o.vendorType = buildUnnamed645();
+    o.vendorType = buildUnnamed563();
     o.videoURL = "foo";
     o.width = 42;
   }
@@ -462,36 +462,36 @@
   if (buildCounterCreative < 3) {
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
-    checkUnnamed634(o.advertiserId);
+    checkUnnamed552(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
-    checkUnnamed635(o.attribute);
+    checkUnnamed553(o.attribute);
     unittest.expect(o.buyerCreativeId, unittest.equals('foo'));
-    checkUnnamed636(o.clickThroughUrl);
-    checkUnnamed638(o.corrections);
-    checkUnnamed640(o.disapprovalReasons);
+    checkUnnamed554(o.clickThroughUrl);
+    checkUnnamed556(o.corrections);
+    checkUnnamed558(o.disapprovalReasons);
     checkCreativeFilteringReasons(o.filteringReasons);
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed642(o.productCategories);
-    checkUnnamed643(o.restrictedCategories);
-    checkUnnamed644(o.sensitiveCategories);
+    checkUnnamed560(o.productCategories);
+    checkUnnamed561(o.restrictedCategories);
+    checkUnnamed562(o.sensitiveCategories);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed645(o.vendorType);
+    checkUnnamed563(o.vendorType);
     unittest.expect(o.videoURL, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterCreative--;
 }
 
-buildUnnamed646() {
+buildUnnamed564() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed646(core.List<api.Creative> o) {
+checkUnnamed564(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -502,7 +502,7 @@
   var o = new api.CreativesList();
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    o.items = buildUnnamed646();
+    o.items = buildUnnamed564();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -513,7 +513,7 @@
 checkCreativesList(api.CreativesList o) {
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    checkUnnamed646(o.items);
+    checkUnnamed564(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -561,14 +561,14 @@
   buildCounterDirectDeal--;
 }
 
-buildUnnamed647() {
+buildUnnamed565() {
   var o = new core.List<api.DirectDeal>();
   o.add(buildDirectDeal());
   o.add(buildDirectDeal());
   return o;
 }
 
-checkUnnamed647(core.List<api.DirectDeal> o) {
+checkUnnamed565(core.List<api.DirectDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectDeal(o[0]);
   checkDirectDeal(o[1]);
@@ -579,7 +579,7 @@
   var o = new api.DirectDealsList();
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    o.directDeals = buildUnnamed647();
+    o.directDeals = buildUnnamed565();
     o.kind = "foo";
   }
   buildCounterDirectDealsList--;
@@ -589,59 +589,59 @@
 checkDirectDealsList(api.DirectDealsList o) {
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    checkUnnamed647(o.directDeals);
+    checkUnnamed565(o.directDeals);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectDealsList--;
 }
 
-buildUnnamed648() {
+buildUnnamed566() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed648(core.List<core.Object> o) {
+checkUnnamed566(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed649() {
+buildUnnamed567() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed649(core.List<core.Object> o) {
+checkUnnamed567(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
   var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed650() {
+buildUnnamed568() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed650(core.List<core.Object> o) {
+checkUnnamed568(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
   var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed651() {
+buildUnnamed569() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed651(core.List<core.Object> o) {
+checkUnnamed569(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o[0]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
   var casted8 = (o[1]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
@@ -652,10 +652,10 @@
   var o = new api.PerformanceReport();
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    o.calloutStatusRate = buildUnnamed648();
-    o.cookieMatcherStatusRate = buildUnnamed649();
-    o.creativeStatusRate = buildUnnamed650();
-    o.hostedMatchStatusRate = buildUnnamed651();
+    o.calloutStatusRate = buildUnnamed566();
+    o.cookieMatcherStatusRate = buildUnnamed567();
+    o.creativeStatusRate = buildUnnamed568();
+    o.hostedMatchStatusRate = buildUnnamed569();
     o.kind = "foo";
     o.latency50thPercentile = 42.0;
     o.latency85thPercentile = 42.0;
@@ -676,10 +676,10 @@
 checkPerformanceReport(api.PerformanceReport o) {
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    checkUnnamed648(o.calloutStatusRate);
-    checkUnnamed649(o.cookieMatcherStatusRate);
-    checkUnnamed650(o.creativeStatusRate);
-    checkUnnamed651(o.hostedMatchStatusRate);
+    checkUnnamed566(o.calloutStatusRate);
+    checkUnnamed567(o.cookieMatcherStatusRate);
+    checkUnnamed568(o.creativeStatusRate);
+    checkUnnamed569(o.hostedMatchStatusRate);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latency50thPercentile, unittest.equals(42.0));
     unittest.expect(o.latency85thPercentile, unittest.equals(42.0));
@@ -696,14 +696,14 @@
   buildCounterPerformanceReport--;
 }
 
-buildUnnamed652() {
+buildUnnamed570() {
   var o = new core.List<api.PerformanceReport>();
   o.add(buildPerformanceReport());
   o.add(buildPerformanceReport());
   return o;
 }
 
-checkUnnamed652(core.List<api.PerformanceReport> o) {
+checkUnnamed570(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerformanceReport(o[0]);
   checkPerformanceReport(o[1]);
@@ -715,7 +715,7 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     o.kind = "foo";
-    o.performanceReport = buildUnnamed652();
+    o.performanceReport = buildUnnamed570();
   }
   buildCounterPerformanceReportList--;
   return o;
@@ -725,19 +725,19 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed652(o.performanceReport);
+    checkUnnamed570(o.performanceReport);
   }
   buildCounterPerformanceReportList--;
 }
 
-buildUnnamed653() {
+buildUnnamed571() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed653(core.List<core.String> o) {
+checkUnnamed571(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -764,40 +764,40 @@
   buildCounterPretargetingConfigDimensions--;
 }
 
-buildUnnamed654() {
+buildUnnamed572() {
   var o = new core.List<api.PretargetingConfigDimensions>();
   o.add(buildPretargetingConfigDimensions());
   o.add(buildPretargetingConfigDimensions());
   return o;
 }
 
-checkUnnamed654(core.List<api.PretargetingConfigDimensions> o) {
+checkUnnamed572(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigDimensions(o[0]);
   checkPretargetingConfigDimensions(o[1]);
 }
 
-buildUnnamed655() {
+buildUnnamed573() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed655(core.List<core.String> o) {
+checkUnnamed573(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed656() {
+buildUnnamed574() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed656(core.List<core.String> o) {
+checkUnnamed574(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -824,105 +824,105 @@
   buildCounterPretargetingConfigExcludedPlacements--;
 }
 
-buildUnnamed657() {
+buildUnnamed575() {
   var o = new core.List<api.PretargetingConfigExcludedPlacements>();
   o.add(buildPretargetingConfigExcludedPlacements());
   o.add(buildPretargetingConfigExcludedPlacements());
   return o;
 }
 
-checkUnnamed657(core.List<api.PretargetingConfigExcludedPlacements> o) {
+checkUnnamed575(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigExcludedPlacements(o[0]);
   checkPretargetingConfigExcludedPlacements(o[1]);
 }
 
-buildUnnamed658() {
+buildUnnamed576() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed658(core.List<core.String> o) {
+checkUnnamed576(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed659() {
+buildUnnamed577() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed659(core.List<core.String> o) {
+checkUnnamed577(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed660() {
+buildUnnamed578() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed660(core.List<core.String> o) {
+checkUnnamed578(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed661() {
+buildUnnamed579() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed661(core.List<core.String> o) {
+checkUnnamed579(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed662() {
+buildUnnamed580() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed662(core.List<core.String> o) {
+checkUnnamed580(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed663() {
+buildUnnamed581() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed663(core.List<core.String> o) {
+checkUnnamed581(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed664() {
+buildUnnamed582() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed664(core.List<core.String> o) {
+checkUnnamed582(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -949,79 +949,79 @@
   buildCounterPretargetingConfigPlacements--;
 }
 
-buildUnnamed665() {
+buildUnnamed583() {
   var o = new core.List<api.PretargetingConfigPlacements>();
   o.add(buildPretargetingConfigPlacements());
   o.add(buildPretargetingConfigPlacements());
   return o;
 }
 
-checkUnnamed665(core.List<api.PretargetingConfigPlacements> o) {
+checkUnnamed583(core.List<api.PretargetingConfigPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigPlacements(o[0]);
   checkPretargetingConfigPlacements(o[1]);
 }
 
-buildUnnamed666() {
+buildUnnamed584() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed666(core.List<core.String> o) {
+checkUnnamed584(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed667() {
+buildUnnamed585() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed667(core.List<core.String> o) {
+checkUnnamed585(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed668() {
+buildUnnamed586() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed668(core.List<core.String> o) {
+checkUnnamed586(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed669() {
+buildUnnamed587() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed669(core.List<core.String> o) {
+checkUnnamed587(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed670() {
+buildUnnamed588() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed670(core.List<core.String> o) {
+checkUnnamed588(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1035,26 +1035,26 @@
     o.billingId = "foo";
     o.configId = "foo";
     o.configName = "foo";
-    o.creativeType = buildUnnamed653();
-    o.dimensions = buildUnnamed654();
-    o.excludedContentLabels = buildUnnamed655();
-    o.excludedGeoCriteriaIds = buildUnnamed656();
-    o.excludedPlacements = buildUnnamed657();
-    o.excludedUserLists = buildUnnamed658();
-    o.excludedVerticals = buildUnnamed659();
-    o.geoCriteriaIds = buildUnnamed660();
+    o.creativeType = buildUnnamed571();
+    o.dimensions = buildUnnamed572();
+    o.excludedContentLabels = buildUnnamed573();
+    o.excludedGeoCriteriaIds = buildUnnamed574();
+    o.excludedPlacements = buildUnnamed575();
+    o.excludedUserLists = buildUnnamed576();
+    o.excludedVerticals = buildUnnamed577();
+    o.geoCriteriaIds = buildUnnamed578();
     o.isActive = true;
     o.kind = "foo";
-    o.languages = buildUnnamed661();
-    o.mobileCarriers = buildUnnamed662();
-    o.mobileDevices = buildUnnamed663();
-    o.mobileOperatingSystemVersions = buildUnnamed664();
-    o.placements = buildUnnamed665();
-    o.platforms = buildUnnamed666();
-    o.supportedCreativeAttributes = buildUnnamed667();
-    o.userLists = buildUnnamed668();
-    o.vendorTypes = buildUnnamed669();
-    o.verticals = buildUnnamed670();
+    o.languages = buildUnnamed579();
+    o.mobileCarriers = buildUnnamed580();
+    o.mobileDevices = buildUnnamed581();
+    o.mobileOperatingSystemVersions = buildUnnamed582();
+    o.placements = buildUnnamed583();
+    o.platforms = buildUnnamed584();
+    o.supportedCreativeAttributes = buildUnnamed585();
+    o.userLists = buildUnnamed586();
+    o.vendorTypes = buildUnnamed587();
+    o.verticals = buildUnnamed588();
   }
   buildCounterPretargetingConfig--;
   return o;
@@ -1066,38 +1066,38 @@
     unittest.expect(o.billingId, unittest.equals('foo'));
     unittest.expect(o.configId, unittest.equals('foo'));
     unittest.expect(o.configName, unittest.equals('foo'));
-    checkUnnamed653(o.creativeType);
-    checkUnnamed654(o.dimensions);
-    checkUnnamed655(o.excludedContentLabels);
-    checkUnnamed656(o.excludedGeoCriteriaIds);
-    checkUnnamed657(o.excludedPlacements);
-    checkUnnamed658(o.excludedUserLists);
-    checkUnnamed659(o.excludedVerticals);
-    checkUnnamed660(o.geoCriteriaIds);
+    checkUnnamed571(o.creativeType);
+    checkUnnamed572(o.dimensions);
+    checkUnnamed573(o.excludedContentLabels);
+    checkUnnamed574(o.excludedGeoCriteriaIds);
+    checkUnnamed575(o.excludedPlacements);
+    checkUnnamed576(o.excludedUserLists);
+    checkUnnamed577(o.excludedVerticals);
+    checkUnnamed578(o.geoCriteriaIds);
     unittest.expect(o.isActive, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed661(o.languages);
-    checkUnnamed662(o.mobileCarriers);
-    checkUnnamed663(o.mobileDevices);
-    checkUnnamed664(o.mobileOperatingSystemVersions);
-    checkUnnamed665(o.placements);
-    checkUnnamed666(o.platforms);
-    checkUnnamed667(o.supportedCreativeAttributes);
-    checkUnnamed668(o.userLists);
-    checkUnnamed669(o.vendorTypes);
-    checkUnnamed670(o.verticals);
+    checkUnnamed579(o.languages);
+    checkUnnamed580(o.mobileCarriers);
+    checkUnnamed581(o.mobileDevices);
+    checkUnnamed582(o.mobileOperatingSystemVersions);
+    checkUnnamed583(o.placements);
+    checkUnnamed584(o.platforms);
+    checkUnnamed585(o.supportedCreativeAttributes);
+    checkUnnamed586(o.userLists);
+    checkUnnamed587(o.vendorTypes);
+    checkUnnamed588(o.verticals);
   }
   buildCounterPretargetingConfig--;
 }
 
-buildUnnamed671() {
+buildUnnamed589() {
   var o = new core.List<api.PretargetingConfig>();
   o.add(buildPretargetingConfig());
   o.add(buildPretargetingConfig());
   return o;
 }
 
-checkUnnamed671(core.List<api.PretargetingConfig> o) {
+checkUnnamed589(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfig(o[0]);
   checkPretargetingConfig(o[1]);
@@ -1108,7 +1108,7 @@
   var o = new api.PretargetingConfigList();
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    o.items = buildUnnamed671();
+    o.items = buildUnnamed589();
     o.kind = "foo";
   }
   buildCounterPretargetingConfigList--;
@@ -1118,33 +1118,33 @@
 checkPretargetingConfigList(api.PretargetingConfigList o) {
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    checkUnnamed671(o.items);
+    checkUnnamed589(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPretargetingConfigList--;
 }
 
-buildUnnamed672() {
+buildUnnamed590() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed672(core.List<core.int> o) {
+checkUnnamed590(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed673() {
+buildUnnamed591() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed673(core.List<core.String> o) {
+checkUnnamed591(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1745,8 +1745,8 @@
 
       var mock = new common_test.HttpServerMock();
       api.CreativesResourceApi res = new api.AdexchangebuyerApi(mock).creatives;
-      var arg_accountId = buildUnnamed672();
-      var arg_buyerCreativeId = buildUnnamed673();
+      var arg_accountId = buildUnnamed590();
+      var arg_buyerCreativeId = buildUnnamed591();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_statusFilter = "foo";
diff --git a/generated/googleapis/test/adexchangeseller/v1_1_test.dart b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
index df1c733..9229e3f 100644
--- a/generated/googleapis/test/adexchangeseller/v1_1_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
@@ -66,14 +66,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed280() {
+buildUnnamed241() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed280(core.List<api.AdClient> o) {
+checkUnnamed241(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -85,7 +85,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed280();
+    o.items = buildUnnamed241();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -97,7 +97,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed280(o.items);
+    checkUnnamed241(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -131,14 +131,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed281() {
+buildUnnamed242() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed281(core.List<api.AdUnit> o) {
+checkUnnamed242(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed281();
+    o.items = buildUnnamed242();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -162,7 +162,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed281(o.items);
+    checkUnnamed242(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -196,14 +196,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed282() {
+buildUnnamed243() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed282(core.List<api.Alert> o) {
+checkUnnamed243(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -214,7 +214,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed282();
+    o.items = buildUnnamed243();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -224,7 +224,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed282(o.items);
+    checkUnnamed243(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -282,14 +282,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed283() {
+buildUnnamed244() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed283(core.List<api.CustomChannel> o) {
+checkUnnamed244(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -301,7 +301,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed283();
+    o.items = buildUnnamed244();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -313,21 +313,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed283(o.items);
+    checkUnnamed244(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed284() {
+buildUnnamed245() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed284(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed245(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -338,7 +338,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed284();
+    o.items = buildUnnamed245();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -348,7 +348,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed284(o.items);
+    checkUnnamed245(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -387,14 +387,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed285() {
+buildUnnamed246() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed285(core.List<api.PreferredDeal> o) {
+checkUnnamed246(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -405,7 +405,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed285();
+    o.items = buildUnnamed246();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -415,20 +415,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed285(o.items);
+    checkUnnamed246(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed286() {
+buildUnnamed247() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed286(core.List<core.String> o) {
+checkUnnamed247(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -457,66 +457,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed287() {
+buildUnnamed248() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed287(core.List<api.ReportHeaders> o) {
+checkUnnamed248(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed288() {
+buildUnnamed249() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed288(core.List<core.String> o) {
+checkUnnamed249(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed289() {
+buildUnnamed250() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed288());
-  o.add(buildUnnamed288());
+  o.add(buildUnnamed249());
+  o.add(buildUnnamed249());
   return o;
 }
 
-checkUnnamed289(core.List<core.List<core.String>> o) {
+checkUnnamed250(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed288(o[0]);
-  checkUnnamed288(o[1]);
+  checkUnnamed249(o[0]);
+  checkUnnamed249(o[1]);
 }
 
-buildUnnamed290() {
+buildUnnamed251() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed290(core.List<core.String> o) {
+checkUnnamed251(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed291() {
+buildUnnamed252() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed291(core.List<core.String> o) {
+checkUnnamed252(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -527,13 +527,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed286();
-    o.headers = buildUnnamed287();
+    o.averages = buildUnnamed247();
+    o.headers = buildUnnamed248();
     o.kind = "foo";
-    o.rows = buildUnnamed289();
+    o.rows = buildUnnamed250();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed290();
-    o.warnings = buildUnnamed291();
+    o.totals = buildUnnamed251();
+    o.warnings = buildUnnamed252();
   }
   buildCounterReport--;
   return o;
@@ -542,77 +542,77 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed286(o.averages);
-    checkUnnamed287(o.headers);
+    checkUnnamed247(o.averages);
+    checkUnnamed248(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed289(o.rows);
+    checkUnnamed250(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed290(o.totals);
-    checkUnnamed291(o.warnings);
+    checkUnnamed251(o.totals);
+    checkUnnamed252(o.warnings);
   }
   buildCounterReport--;
 }
 
-buildUnnamed292() {
+buildUnnamed253() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed292(core.List<core.String> o) {
+checkUnnamed253(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed293() {
+buildUnnamed254() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed293(core.List<core.String> o) {
+checkUnnamed254(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed294() {
+buildUnnamed255() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed294(core.List<core.String> o) {
+checkUnnamed255(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed295() {
+buildUnnamed256() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed295(core.List<core.String> o) {
+checkUnnamed256(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed296() {
+buildUnnamed257() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed296(core.List<core.String> o) {
+checkUnnamed257(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -623,13 +623,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed292();
-    o.compatibleMetrics = buildUnnamed293();
+    o.compatibleDimensions = buildUnnamed253();
+    o.compatibleMetrics = buildUnnamed254();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed294();
-    o.requiredMetrics = buildUnnamed295();
-    o.supportedProducts = buildUnnamed296();
+    o.requiredDimensions = buildUnnamed255();
+    o.requiredMetrics = buildUnnamed256();
+    o.supportedProducts = buildUnnamed257();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -638,13 +638,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed292(o.compatibleDimensions);
-    checkUnnamed293(o.compatibleMetrics);
+    checkUnnamed253(o.compatibleDimensions);
+    checkUnnamed254(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed294(o.requiredDimensions);
-    checkUnnamed295(o.requiredMetrics);
-    checkUnnamed296(o.supportedProducts);
+    checkUnnamed255(o.requiredDimensions);
+    checkUnnamed256(o.requiredMetrics);
+    checkUnnamed257(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -672,14 +672,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed297() {
+buildUnnamed258() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed297(core.List<api.SavedReport> o) {
+checkUnnamed258(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -691,7 +691,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed297();
+    o.items = buildUnnamed258();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -703,7 +703,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed297(o.items);
+    checkUnnamed258(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -733,14 +733,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed298() {
+buildUnnamed259() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed298(core.List<api.UrlChannel> o) {
+checkUnnamed259(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -752,7 +752,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed298();
+    o.items = buildUnnamed259();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -764,60 +764,60 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed298(o.items);
+    checkUnnamed259(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed299() {
+buildUnnamed260() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed299(core.List<core.String> o) {
+checkUnnamed260(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed300() {
+buildUnnamed261() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed300(core.List<core.String> o) {
+checkUnnamed261(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed301() {
+buildUnnamed262() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed301(core.List<core.String> o) {
+checkUnnamed262(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed302() {
+buildUnnamed263() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed302(core.List<core.String> o) {
+checkUnnamed263(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1745,12 +1745,12 @@
       api.ReportsResourceApi res = new api.AdexchangesellerApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed299();
-      var arg_filter = buildUnnamed300();
+      var arg_dimension = buildUnnamed260();
+      var arg_filter = buildUnnamed261();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed301();
-      var arg_sort = buildUnnamed302();
+      var arg_metric = buildUnnamed262();
+      var arg_sort = buildUnnamed263();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/adexchangeseller/v2_0_test.dart b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
index 8816cbd..484827b 100644
--- a/generated/googleapis/test/adexchangeseller/v2_0_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v2_0_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed91() {
+buildUnnamed776() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed91(core.List<api.Account> o) {
+checkUnnamed776(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -58,7 +58,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed91();
+    o.items = buildUnnamed776();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -70,7 +70,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed91(o.items);
+    checkUnnamed776(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -104,14 +104,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed92() {
+buildUnnamed777() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed92(core.List<api.AdClient> o) {
+checkUnnamed777(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -123,7 +123,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed92();
+    o.items = buildUnnamed777();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,7 +135,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed92(o.items);
+    checkUnnamed777(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -169,14 +169,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed93() {
+buildUnnamed778() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed93(core.List<api.Alert> o) {
+checkUnnamed778(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -187,7 +187,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed93();
+    o.items = buildUnnamed778();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -197,7 +197,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed93(o.items);
+    checkUnnamed778(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -255,14 +255,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed94() {
+buildUnnamed779() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed94(core.List<api.CustomChannel> o) {
+checkUnnamed779(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -274,7 +274,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed94();
+    o.items = buildUnnamed779();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -286,21 +286,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed94(o.items);
+    checkUnnamed779(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed95() {
+buildUnnamed780() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed95(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed780(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -311,7 +311,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed95();
+    o.items = buildUnnamed780();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -321,7 +321,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed95(o.items);
+    checkUnnamed780(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -360,14 +360,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed96() {
+buildUnnamed781() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed96(core.List<api.PreferredDeal> o) {
+checkUnnamed781(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -378,7 +378,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed96();
+    o.items = buildUnnamed781();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -388,20 +388,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed96(o.items);
+    checkUnnamed781(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed97() {
+buildUnnamed782() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed97(core.List<core.String> o) {
+checkUnnamed782(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -430,66 +430,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed98() {
+buildUnnamed783() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed98(core.List<api.ReportHeaders> o) {
+checkUnnamed783(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed99() {
+buildUnnamed784() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed99(core.List<core.String> o) {
+checkUnnamed784(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed100() {
+buildUnnamed785() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed99());
-  o.add(buildUnnamed99());
+  o.add(buildUnnamed784());
+  o.add(buildUnnamed784());
   return o;
 }
 
-checkUnnamed100(core.List<core.List<core.String>> o) {
+checkUnnamed785(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed99(o[0]);
-  checkUnnamed99(o[1]);
+  checkUnnamed784(o[0]);
+  checkUnnamed784(o[1]);
 }
 
-buildUnnamed101() {
+buildUnnamed786() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed101(core.List<core.String> o) {
+checkUnnamed786(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed102() {
+buildUnnamed787() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed102(core.List<core.String> o) {
+checkUnnamed787(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -500,13 +500,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed97();
-    o.headers = buildUnnamed98();
+    o.averages = buildUnnamed782();
+    o.headers = buildUnnamed783();
     o.kind = "foo";
-    o.rows = buildUnnamed100();
+    o.rows = buildUnnamed785();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed101();
-    o.warnings = buildUnnamed102();
+    o.totals = buildUnnamed786();
+    o.warnings = buildUnnamed787();
   }
   buildCounterReport--;
   return o;
@@ -515,77 +515,77 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed97(o.averages);
-    checkUnnamed98(o.headers);
+    checkUnnamed782(o.averages);
+    checkUnnamed783(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed100(o.rows);
+    checkUnnamed785(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed101(o.totals);
-    checkUnnamed102(o.warnings);
+    checkUnnamed786(o.totals);
+    checkUnnamed787(o.warnings);
   }
   buildCounterReport--;
 }
 
-buildUnnamed103() {
+buildUnnamed788() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed103(core.List<core.String> o) {
+checkUnnamed788(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed104() {
+buildUnnamed789() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed104(core.List<core.String> o) {
+checkUnnamed789(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed105() {
+buildUnnamed790() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed105(core.List<core.String> o) {
+checkUnnamed790(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed106() {
+buildUnnamed791() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed106(core.List<core.String> o) {
+checkUnnamed791(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed107() {
+buildUnnamed792() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed107(core.List<core.String> o) {
+checkUnnamed792(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -596,13 +596,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed103();
-    o.compatibleMetrics = buildUnnamed104();
+    o.compatibleDimensions = buildUnnamed788();
+    o.compatibleMetrics = buildUnnamed789();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed105();
-    o.requiredMetrics = buildUnnamed106();
-    o.supportedProducts = buildUnnamed107();
+    o.requiredDimensions = buildUnnamed790();
+    o.requiredMetrics = buildUnnamed791();
+    o.supportedProducts = buildUnnamed792();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -611,13 +611,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed103(o.compatibleDimensions);
-    checkUnnamed104(o.compatibleMetrics);
+    checkUnnamed788(o.compatibleDimensions);
+    checkUnnamed789(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed105(o.requiredDimensions);
-    checkUnnamed106(o.requiredMetrics);
-    checkUnnamed107(o.supportedProducts);
+    checkUnnamed790(o.requiredDimensions);
+    checkUnnamed791(o.requiredMetrics);
+    checkUnnamed792(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -645,14 +645,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed108() {
+buildUnnamed793() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed108(core.List<api.SavedReport> o) {
+checkUnnamed793(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -664,7 +664,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed108();
+    o.items = buildUnnamed793();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -676,7 +676,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed108(o.items);
+    checkUnnamed793(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -706,14 +706,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed109() {
+buildUnnamed794() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed109(core.List<api.UrlChannel> o) {
+checkUnnamed794(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -725,7 +725,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed109();
+    o.items = buildUnnamed794();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -737,60 +737,60 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed109(o.items);
+    checkUnnamed794(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed110() {
+buildUnnamed795() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed110(core.List<core.String> o) {
+checkUnnamed795(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed111() {
+buildUnnamed796() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed111(core.List<core.String> o) {
+checkUnnamed796(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed112() {
+buildUnnamed797() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed112(core.List<core.String> o) {
+checkUnnamed797(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed113() {
+buildUnnamed798() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed113(core.List<core.String> o) {
+checkUnnamed798(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1563,12 +1563,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed110();
-      var arg_filter = buildUnnamed111();
+      var arg_dimension = buildUnnamed795();
+      var arg_filter = buildUnnamed796();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed112();
-      var arg_sort = buildUnnamed113();
+      var arg_metric = buildUnnamed797();
+      var arg_sort = buildUnnamed798();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index 4b319a1..7371ef4 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -43,14 +43,14 @@
   buildCounterAlias--;
 }
 
-buildUnnamed919() {
+buildUnnamed463() {
   var o = new core.List<api.Alias>();
   o.add(buildAlias());
   o.add(buildAlias());
   return o;
 }
 
-checkUnnamed919(core.List<api.Alias> o) {
+checkUnnamed463(core.List<api.Alias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlias(o[0]);
   checkAlias(o[1]);
@@ -61,7 +61,7 @@
   var o = new api.Aliases();
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    o.aliases = buildUnnamed919();
+    o.aliases = buildUnnamed463();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -72,7 +72,7 @@
 checkAliases(api.Aliases o) {
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    checkUnnamed919(o.aliases);
+    checkUnnamed463(o.aliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -110,14 +110,14 @@
   buildCounterAsp--;
 }
 
-buildUnnamed920() {
+buildUnnamed464() {
   var o = new core.List<api.Asp>();
   o.add(buildAsp());
   o.add(buildAsp());
   return o;
 }
 
-checkUnnamed920(core.List<api.Asp> o) {
+checkUnnamed464(core.List<api.Asp> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsp(o[0]);
   checkAsp(o[1]);
@@ -129,7 +129,7 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed920();
+    o.items = buildUnnamed464();
     o.kind = "foo";
   }
   buildCounterAsps--;
@@ -140,20 +140,20 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed920(o.items);
+    checkUnnamed464(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAsps--;
 }
 
-buildUnnamed921() {
+buildUnnamed465() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed921(core.Map<core.String, core.String> o) {
+checkUnnamed465(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -168,7 +168,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed921();
+    o.params = buildUnnamed465();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -186,7 +186,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed921(o.params);
+    checkUnnamed465(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -196,6 +196,40 @@
   buildCounterChannel--;
 }
 
+core.int buildCounterChromeOsDeviceActiveTimeRanges = 0;
+buildChromeOsDeviceActiveTimeRanges() {
+  var o = new api.ChromeOsDeviceActiveTimeRanges();
+  buildCounterChromeOsDeviceActiveTimeRanges++;
+  if (buildCounterChromeOsDeviceActiveTimeRanges < 3) {
+    o.activeTime = 42;
+    o.date = core.DateTime.parse("2002-02-27T14:01:02Z");
+  }
+  buildCounterChromeOsDeviceActiveTimeRanges--;
+  return o;
+}
+
+checkChromeOsDeviceActiveTimeRanges(api.ChromeOsDeviceActiveTimeRanges o) {
+  buildCounterChromeOsDeviceActiveTimeRanges++;
+  if (buildCounterChromeOsDeviceActiveTimeRanges < 3) {
+    unittest.expect(o.activeTime, unittest.equals(42));
+    unittest.expect(o.date, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
+  }
+  buildCounterChromeOsDeviceActiveTimeRanges--;
+}
+
+buildUnnamed466() {
+  var o = new core.List<api.ChromeOsDeviceActiveTimeRanges>();
+  o.add(buildChromeOsDeviceActiveTimeRanges());
+  o.add(buildChromeOsDeviceActiveTimeRanges());
+  return o;
+}
+
+checkUnnamed466(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkChromeOsDeviceActiveTimeRanges(o[0]);
+  checkChromeOsDeviceActiveTimeRanges(o[1]);
+}
+
 core.int buildCounterChromeOsDeviceRecentUsers = 0;
 buildChromeOsDeviceRecentUsers() {
   var o = new api.ChromeOsDeviceRecentUsers();
@@ -217,14 +251,14 @@
   buildCounterChromeOsDeviceRecentUsers--;
 }
 
-buildUnnamed922() {
+buildUnnamed467() {
   var o = new core.List<api.ChromeOsDeviceRecentUsers>();
   o.add(buildChromeOsDeviceRecentUsers());
   o.add(buildChromeOsDeviceRecentUsers());
   return o;
 }
 
-checkUnnamed922(core.List<api.ChromeOsDeviceRecentUsers> o) {
+checkUnnamed467(core.List<api.ChromeOsDeviceRecentUsers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceRecentUsers(o[0]);
   checkChromeOsDeviceRecentUsers(o[1]);
@@ -235,6 +269,7 @@
   var o = new api.ChromeOsDevice();
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
+    o.activeTimeRanges = buildUnnamed466();
     o.annotatedLocation = "foo";
     o.annotatedUser = "foo";
     o.bootMode = "foo";
@@ -253,7 +288,7 @@
     o.orgUnitPath = "foo";
     o.osVersion = "foo";
     o.platformVersion = "foo";
-    o.recentUsers = buildUnnamed922();
+    o.recentUsers = buildUnnamed467();
     o.serialNumber = "foo";
     o.status = "foo";
     o.supportEndDate = core.DateTime.parse("2002-02-27T14:01:02");
@@ -266,6 +301,7 @@
 checkChromeOsDevice(api.ChromeOsDevice o) {
   buildCounterChromeOsDevice++;
   if (buildCounterChromeOsDevice < 3) {
+    checkUnnamed466(o.activeTimeRanges);
     unittest.expect(o.annotatedLocation, unittest.equals('foo'));
     unittest.expect(o.annotatedUser, unittest.equals('foo'));
     unittest.expect(o.bootMode, unittest.equals('foo'));
@@ -284,7 +320,7 @@
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     unittest.expect(o.osVersion, unittest.equals('foo'));
     unittest.expect(o.platformVersion, unittest.equals('foo'));
-    checkUnnamed922(o.recentUsers);
+    checkUnnamed467(o.recentUsers);
     unittest.expect(o.serialNumber, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.supportEndDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -293,14 +329,14 @@
   buildCounterChromeOsDevice--;
 }
 
-buildUnnamed923() {
+buildUnnamed468() {
   var o = new core.List<api.ChromeOsDevice>();
   o.add(buildChromeOsDevice());
   o.add(buildChromeOsDevice());
   return o;
 }
 
-checkUnnamed923(core.List<api.ChromeOsDevice> o) {
+checkUnnamed468(core.List<api.ChromeOsDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDevice(o[0]);
   checkChromeOsDevice(o[1]);
@@ -311,7 +347,7 @@
   var o = new api.ChromeOsDevices();
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    o.chromeosdevices = buildUnnamed923();
+    o.chromeosdevices = buildUnnamed468();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -323,7 +359,7 @@
 checkChromeOsDevices(api.ChromeOsDevices o) {
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    checkUnnamed923(o.chromeosdevices);
+    checkUnnamed468(o.chromeosdevices);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -331,27 +367,27 @@
   buildCounterChromeOsDevices--;
 }
 
-buildUnnamed924() {
+buildUnnamed469() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed924(core.List<core.String> o) {
+checkUnnamed469(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed925() {
+buildUnnamed470() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed925(core.List<core.String> o) {
+checkUnnamed470(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -363,7 +399,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     o.adminCreated = true;
-    o.aliases = buildUnnamed924();
+    o.aliases = buildUnnamed469();
     o.description = "foo";
     o.directMembersCount = "foo";
     o.email = "foo";
@@ -371,7 +407,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nonEditableAliases = buildUnnamed925();
+    o.nonEditableAliases = buildUnnamed470();
   }
   buildCounterGroup--;
   return o;
@@ -381,7 +417,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     unittest.expect(o.adminCreated, unittest.isTrue);
-    checkUnnamed924(o.aliases);
+    checkUnnamed469(o.aliases);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.directMembersCount, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -389,19 +425,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed925(o.nonEditableAliases);
+    checkUnnamed470(o.nonEditableAliases);
   }
   buildCounterGroup--;
 }
 
-buildUnnamed926() {
+buildUnnamed471() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed926(core.List<api.Group> o) {
+checkUnnamed471(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -413,7 +449,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     o.etag = "foo";
-    o.groups = buildUnnamed926();
+    o.groups = buildUnnamed471();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -425,7 +461,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed926(o.groups);
+    checkUnnamed471(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -461,14 +497,14 @@
   buildCounterMember--;
 }
 
-buildUnnamed927() {
+buildUnnamed472() {
   var o = new core.List<api.Member>();
   o.add(buildMember());
   o.add(buildMember());
   return o;
 }
 
-checkUnnamed927(core.List<api.Member> o) {
+checkUnnamed472(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMember(o[0]);
   checkMember(o[1]);
@@ -481,7 +517,7 @@
   if (buildCounterMembers < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.members = buildUnnamed927();
+    o.members = buildUnnamed472();
     o.nextPageToken = "foo";
   }
   buildCounterMembers--;
@@ -493,20 +529,20 @@
   if (buildCounterMembers < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed927(o.members);
+    checkUnnamed472(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMembers--;
 }
 
-buildUnnamed928() {
+buildUnnamed473() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed928(core.List<core.String> o) {
+checkUnnamed473(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -519,7 +555,7 @@
   if (buildCounterMobileDeviceApplications < 3) {
     o.displayName = "foo";
     o.packageName = "foo";
-    o.permission = buildUnnamed928();
+    o.permission = buildUnnamed473();
     o.versionCode = 42;
     o.versionName = "foo";
   }
@@ -532,47 +568,47 @@
   if (buildCounterMobileDeviceApplications < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed928(o.permission);
+    checkUnnamed473(o.permission);
     unittest.expect(o.versionCode, unittest.equals(42));
     unittest.expect(o.versionName, unittest.equals('foo'));
   }
   buildCounterMobileDeviceApplications--;
 }
 
-buildUnnamed929() {
+buildUnnamed474() {
   var o = new core.List<api.MobileDeviceApplications>();
   o.add(buildMobileDeviceApplications());
   o.add(buildMobileDeviceApplications());
   return o;
 }
 
-checkUnnamed929(core.List<api.MobileDeviceApplications> o) {
+checkUnnamed474(core.List<api.MobileDeviceApplications> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDeviceApplications(o[0]);
   checkMobileDeviceApplications(o[1]);
 }
 
-buildUnnamed930() {
+buildUnnamed475() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed930(core.List<core.String> o) {
+checkUnnamed475(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed931() {
+buildUnnamed476() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed931(core.List<core.String> o) {
+checkUnnamed476(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -583,13 +619,13 @@
   var o = new api.MobileDevice();
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    o.applications = buildUnnamed929();
+    o.applications = buildUnnamed474();
     o.basebandVersion = "foo";
     o.buildNumber = "foo";
     o.defaultLanguage = "foo";
     o.deviceCompromisedStatus = "foo";
     o.deviceId = "foo";
-    o.email = buildUnnamed930();
+    o.email = buildUnnamed475();
     o.etag = "foo";
     o.firstSync = core.DateTime.parse("2002-02-27T14:01:02");
     o.hardwareId = "foo";
@@ -600,7 +636,7 @@
     o.managedAccountIsOnOwnerProfile = true;
     o.meid = "foo";
     o.model = "foo";
-    o.name = buildUnnamed931();
+    o.name = buildUnnamed476();
     o.networkOperator = "foo";
     o.os = "foo";
     o.resourceId = "foo";
@@ -617,13 +653,13 @@
 checkMobileDevice(api.MobileDevice o) {
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    checkUnnamed929(o.applications);
+    checkUnnamed474(o.applications);
     unittest.expect(o.basebandVersion, unittest.equals('foo'));
     unittest.expect(o.buildNumber, unittest.equals('foo'));
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.deviceCompromisedStatus, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkUnnamed930(o.email);
+    checkUnnamed475(o.email);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.firstSync, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.hardwareId, unittest.equals('foo'));
@@ -634,7 +670,7 @@
     unittest.expect(o.managedAccountIsOnOwnerProfile, unittest.isTrue);
     unittest.expect(o.meid, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
-    checkUnnamed931(o.name);
+    checkUnnamed476(o.name);
     unittest.expect(o.networkOperator, unittest.equals('foo'));
     unittest.expect(o.os, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
@@ -666,14 +702,14 @@
   buildCounterMobileDeviceAction--;
 }
 
-buildUnnamed932() {
+buildUnnamed477() {
   var o = new core.List<api.MobileDevice>();
   o.add(buildMobileDevice());
   o.add(buildMobileDevice());
   return o;
 }
 
-checkUnnamed932(core.List<api.MobileDevice> o) {
+checkUnnamed477(core.List<api.MobileDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDevice(o[0]);
   checkMobileDevice(o[1]);
@@ -686,7 +722,7 @@
   if (buildCounterMobileDevices < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.mobiledevices = buildUnnamed932();
+    o.mobiledevices = buildUnnamed477();
     o.nextPageToken = "foo";
   }
   buildCounterMobileDevices--;
@@ -698,7 +734,7 @@
   if (buildCounterMobileDevices < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed932(o.mobiledevices);
+    checkUnnamed477(o.mobiledevices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMobileDevices--;
@@ -737,14 +773,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed933() {
+buildUnnamed478() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed933(core.List<api.Notification> o) {
+checkUnnamed478(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -756,7 +792,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed933();
+    o.items = buildUnnamed478();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.unreadNotificationsCount = 42;
@@ -769,7 +805,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed933(o.items);
+    checkUnnamed478(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.unreadNotificationsCount, unittest.equals(42));
@@ -808,14 +844,14 @@
   buildCounterOrgUnit--;
 }
 
-buildUnnamed934() {
+buildUnnamed479() {
   var o = new core.List<api.OrgUnit>();
   o.add(buildOrgUnit());
   o.add(buildOrgUnit());
   return o;
 }
 
-checkUnnamed934(core.List<api.OrgUnit> o) {
+checkUnnamed479(core.List<api.OrgUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgUnit(o[0]);
   checkOrgUnit(o[1]);
@@ -828,7 +864,7 @@
   if (buildCounterOrgUnits < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.organizationUnits = buildUnnamed934();
+    o.organizationUnits = buildUnnamed479();
   }
   buildCounterOrgUnits--;
   return o;
@@ -839,19 +875,19 @@
   if (buildCounterOrgUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed934(o.organizationUnits);
+    checkUnnamed479(o.organizationUnits);
   }
   buildCounterOrgUnits--;
 }
 
-buildUnnamed935() {
+buildUnnamed480() {
   var o = new core.List<api.SchemaFieldSpec>();
   o.add(buildSchemaFieldSpec());
   o.add(buildSchemaFieldSpec());
   return o;
 }
 
-checkUnnamed935(core.List<api.SchemaFieldSpec> o) {
+checkUnnamed480(core.List<api.SchemaFieldSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchemaFieldSpec(o[0]);
   checkSchemaFieldSpec(o[1]);
@@ -863,7 +899,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     o.etag = "foo";
-    o.fields = buildUnnamed935();
+    o.fields = buildUnnamed480();
     o.kind = "foo";
     o.schemaId = "foo";
     o.schemaName = "foo";
@@ -876,7 +912,7 @@
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed935(o.fields);
+    checkUnnamed480(o.fields);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.schemaId, unittest.equals('foo'));
     unittest.expect(o.schemaName, unittest.equals('foo'));
@@ -940,14 +976,14 @@
   buildCounterSchemaFieldSpec--;
 }
 
-buildUnnamed936() {
+buildUnnamed481() {
   var o = new core.List<api.Schema>();
   o.add(buildSchema());
   o.add(buildSchema());
   return o;
 }
 
-checkUnnamed936(core.List<api.Schema> o) {
+checkUnnamed481(core.List<api.Schema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSchema(o[0]);
   checkSchema(o[1]);
@@ -960,7 +996,7 @@
   if (buildCounterSchemas < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.schemas = buildUnnamed936();
+    o.schemas = buildUnnamed481();
   }
   buildCounterSchemas--;
   return o;
@@ -971,19 +1007,19 @@
   if (buildCounterSchemas < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed936(o.schemas);
+    checkUnnamed481(o.schemas);
   }
   buildCounterSchemas--;
 }
 
-buildUnnamed937() {
+buildUnnamed482() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed937(core.List<core.String> o) {
+checkUnnamed482(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1000,7 +1036,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nativeApp = true;
-    o.scopes = buildUnnamed937();
+    o.scopes = buildUnnamed482();
     o.userKey = "foo";
   }
   buildCounterToken--;
@@ -1016,20 +1052,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nativeApp, unittest.isTrue);
-    checkUnnamed937(o.scopes);
+    checkUnnamed482(o.scopes);
     unittest.expect(o.userKey, unittest.equals('foo'));
   }
   buildCounterToken--;
 }
 
-buildUnnamed938() {
+buildUnnamed483() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed938(core.List<api.Token> o) {
+checkUnnamed483(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -1041,7 +1077,7 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed938();
+    o.items = buildUnnamed483();
     o.kind = "foo";
   }
   buildCounterTokens--;
@@ -1052,46 +1088,46 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed938(o.items);
+    checkUnnamed483(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTokens--;
 }
 
-buildUnnamed939() {
+buildUnnamed484() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed939(core.List<core.String> o) {
+checkUnnamed484(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed940() {
+buildUnnamed485() {
   var o = new core.Map<core.String, api.UserCustomProperties>();
   o["x"] = buildUserCustomProperties();
   o["y"] = buildUserCustomProperties();
   return o;
 }
 
-checkUnnamed940(core.Map<core.String, api.UserCustomProperties> o) {
+checkUnnamed485(core.Map<core.String, api.UserCustomProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserCustomProperties(o["x"]);
   checkUserCustomProperties(o["y"]);
 }
 
-buildUnnamed941() {
+buildUnnamed486() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed941(core.List<core.String> o) {
+checkUnnamed486(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1104,10 +1140,10 @@
   if (buildCounterUser < 3) {
     o.addresses = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.agreedToTerms = true;
-    o.aliases = buildUnnamed939();
+    o.aliases = buildUnnamed484();
     o.changePasswordAtNextLogin = true;
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.customSchemas = buildUnnamed940();
+    o.customSchemas = buildUnnamed485();
     o.customerId = "foo";
     o.deletionTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.emails = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
@@ -1124,7 +1160,7 @@
     o.kind = "foo";
     o.lastLoginTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.name = buildUserName();
-    o.nonEditableAliases = buildUnnamed941();
+    o.nonEditableAliases = buildUnnamed486();
     o.orgUnitPath = "foo";
     o.organizations = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.password = "foo";
@@ -1144,10 +1180,10 @@
   if (buildCounterUser < 3) {
     var casted1 = (o.addresses) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
     unittest.expect(o.agreedToTerms, unittest.isTrue);
-    checkUnnamed939(o.aliases);
+    checkUnnamed484(o.aliases);
     unittest.expect(o.changePasswordAtNextLogin, unittest.isTrue);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed940(o.customSchemas);
+    checkUnnamed485(o.customSchemas);
     unittest.expect(o.customerId, unittest.equals('foo'));
     unittest.expect(o.deletionTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     var casted2 = (o.emails) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -1164,7 +1200,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastLoginTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUserName(o.name);
-    checkUnnamed941(o.nonEditableAliases);
+    checkUnnamed486(o.nonEditableAliases);
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     var casted5 = (o.organizations) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
     unittest.expect(o.password, unittest.equals('foo'));
@@ -1492,14 +1528,14 @@
   buildCounterUserUndelete--;
 }
 
-buildUnnamed942() {
+buildUnnamed487() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed942(core.List<api.User> o) {
+checkUnnamed487(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -1514,7 +1550,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.triggerEvent = "foo";
-    o.users = buildUnnamed942();
+    o.users = buildUnnamed487();
   }
   buildCounterUsers--;
   return o;
@@ -1527,7 +1563,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.triggerEvent, unittest.equals('foo'));
-    checkUnnamed942(o.users);
+    checkUnnamed487(o.users);
   }
   buildCounterUsers--;
 }
@@ -1557,14 +1593,14 @@
   buildCounterVerificationCode--;
 }
 
-buildUnnamed943() {
+buildUnnamed488() {
   var o = new core.List<api.VerificationCode>();
   o.add(buildVerificationCode());
   o.add(buildVerificationCode());
   return o;
 }
 
-checkUnnamed943(core.List<api.VerificationCode> o) {
+checkUnnamed488(core.List<api.VerificationCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVerificationCode(o[0]);
   checkVerificationCode(o[1]);
@@ -1576,7 +1612,7 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed943();
+    o.items = buildUnnamed488();
     o.kind = "foo";
   }
   buildCounterVerificationCodes--;
@@ -1587,59 +1623,59 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed943(o.items);
+    checkUnnamed488(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVerificationCodes--;
 }
 
-buildUnnamed944() {
+buildUnnamed489() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed944(core.List<core.String> o) {
+checkUnnamed489(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed945() {
+buildUnnamed490() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed945(core.List<core.String> o) {
+checkUnnamed490(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed946() {
+buildUnnamed491() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed946(core.List<core.String> o) {
+checkUnnamed491(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed947() {
+buildUnnamed492() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed947(core.List<core.String> o) {
+checkUnnamed492(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1692,6 +1728,15 @@
   });
 
 
+  unittest.group("obj-schema-ChromeOsDeviceActiveTimeRanges", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildChromeOsDeviceActiveTimeRanges();
+      var od = new api.ChromeOsDeviceActiveTimeRanges.fromJson(o.toJson());
+      checkChromeOsDeviceActiveTimeRanges(od);
+    });
+  });
+
+
   unittest.group("obj-schema-ChromeOsDeviceRecentUsers", () {
     unittest.test("to-json--from-json", () {
       var o = buildChromeOsDeviceRecentUsers();
@@ -3879,7 +3924,7 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed944();
+      var arg_orgUnitPath = buildUnnamed489();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3933,7 +3978,7 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed945();
+      var arg_orgUnitPath = buildUnnamed490();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4104,7 +4149,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed946();
+      var arg_orgUnitPath = buildUnnamed491();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
@@ -4164,7 +4209,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed947();
+      var arg_orgUnitPath = buildUnnamed492();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
diff --git a/generated/googleapis/test/admin/email_migration_v2_test.dart b/generated/googleapis/test/admin/email_migration_v2_test.dart
index 8bb3a70..8bb3315 100644
--- a/generated/googleapis/test/admin/email_migration_v2_test.dart
+++ b/generated/googleapis/test/admin/email_migration_v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed737() {
+buildUnnamed0() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed737(core.List<core.String> o) {
+checkUnnamed0(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -42,7 +42,7 @@
     o.isTrash = true;
     o.isUnread = true;
     o.kind = "foo";
-    o.labels = buildUnnamed737();
+    o.labels = buildUnnamed0();
   }
   buildCounterMailItem--;
   return o;
@@ -59,7 +59,7 @@
     unittest.expect(o.isTrash, unittest.isTrue);
     unittest.expect(o.isUnread, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed737(o.labels);
+    checkUnnamed0(o.labels);
   }
   buildCounterMailItem--;
 }
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index b7cf102..f03a7dd 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed780() {
+buildUnnamed388() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed780(core.List<api.Activity> o) {
+checkUnnamed388(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed780();
+    o.items = buildUnnamed388();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -47,7 +47,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed780(o.items);
+    checkUnnamed388(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -79,27 +79,27 @@
   buildCounterActivityActor--;
 }
 
-buildUnnamed781() {
+buildUnnamed389() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed781(core.List<core.String> o) {
+checkUnnamed389(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed782() {
+buildUnnamed390() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed782(core.List<core.String> o) {
+checkUnnamed390(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -112,8 +112,8 @@
   if (buildCounterActivityEventsParameters < 3) {
     o.boolValue = true;
     o.intValue = "foo";
-    o.multiIntValue = buildUnnamed781();
-    o.multiValue = buildUnnamed782();
+    o.multiIntValue = buildUnnamed389();
+    o.multiValue = buildUnnamed390();
     o.name = "foo";
     o.value = "foo";
   }
@@ -126,22 +126,22 @@
   if (buildCounterActivityEventsParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed781(o.multiIntValue);
-    checkUnnamed782(o.multiValue);
+    checkUnnamed389(o.multiIntValue);
+    checkUnnamed390(o.multiValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterActivityEventsParameters--;
 }
 
-buildUnnamed783() {
+buildUnnamed391() {
   var o = new core.List<api.ActivityEventsParameters>();
   o.add(buildActivityEventsParameters());
   o.add(buildActivityEventsParameters());
   return o;
 }
 
-checkUnnamed783(core.List<api.ActivityEventsParameters> o) {
+checkUnnamed391(core.List<api.ActivityEventsParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEventsParameters(o[0]);
   checkActivityEventsParameters(o[1]);
@@ -153,7 +153,7 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     o.name = "foo";
-    o.parameters = buildUnnamed783();
+    o.parameters = buildUnnamed391();
     o.type = "foo";
   }
   buildCounterActivityEvents--;
@@ -164,20 +164,20 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed783(o.parameters);
+    checkUnnamed391(o.parameters);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterActivityEvents--;
 }
 
-buildUnnamed784() {
+buildUnnamed392() {
   var o = new core.List<api.ActivityEvents>();
   o.add(buildActivityEvents());
   o.add(buildActivityEvents());
   return o;
 }
 
-checkUnnamed784(core.List<api.ActivityEvents> o) {
+checkUnnamed392(core.List<api.ActivityEvents> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEvents(o[0]);
   checkActivityEvents(o[1]);
@@ -215,7 +215,7 @@
   if (buildCounterActivity < 3) {
     o.actor = buildActivityActor();
     o.etag = "foo";
-    o.events = buildUnnamed784();
+    o.events = buildUnnamed392();
     o.id = buildActivityId();
     o.ipAddress = "foo";
     o.kind = "foo";
@@ -230,7 +230,7 @@
   if (buildCounterActivity < 3) {
     checkActivityActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed784(o.events);
+    checkUnnamed392(o.events);
     checkActivityId(o.id);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -239,14 +239,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed785() {
+buildUnnamed393() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed785(core.Map<core.String, core.String> o) {
+checkUnnamed393(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -261,7 +261,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed785();
+    o.params = buildUnnamed393();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -279,7 +279,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed785(o.params);
+    checkUnnamed393(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -314,30 +314,30 @@
   buildCounterUsageReportEntity--;
 }
 
-buildUnnamed786() {
+buildUnnamed394() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   return o;
 }
 
-checkUnnamed786(core.Map<core.String, core.Object> o) {
+checkUnnamed394(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed787() {
+buildUnnamed395() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed786());
-  o.add(buildUnnamed786());
+  o.add(buildUnnamed394());
+  o.add(buildUnnamed394());
   return o;
 }
 
-checkUnnamed787(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed395(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed786(o[0]);
-  checkUnnamed786(o[1]);
+  checkUnnamed394(o[0]);
+  checkUnnamed394(o[1]);
 }
 
 core.int buildCounterUsageReportParameters = 0;
@@ -348,7 +348,7 @@
     o.boolValue = true;
     o.datetimeValue = core.DateTime.parse("2002-02-27T14:01:02");
     o.intValue = "foo";
-    o.msgValue = buildUnnamed787();
+    o.msgValue = buildUnnamed395();
     o.name = "foo";
     o.stringValue = "foo";
   }
@@ -362,21 +362,21 @@
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.datetimeValue, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed787(o.msgValue);
+    checkUnnamed395(o.msgValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
   buildCounterUsageReportParameters--;
 }
 
-buildUnnamed788() {
+buildUnnamed396() {
   var o = new core.List<api.UsageReportParameters>();
   o.add(buildUsageReportParameters());
   o.add(buildUsageReportParameters());
   return o;
 }
 
-checkUnnamed788(core.List<api.UsageReportParameters> o) {
+checkUnnamed396(core.List<api.UsageReportParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportParameters(o[0]);
   checkUsageReportParameters(o[1]);
@@ -391,7 +391,7 @@
     o.entity = buildUsageReportEntity();
     o.etag = "foo";
     o.kind = "foo";
-    o.parameters = buildUnnamed788();
+    o.parameters = buildUnnamed396();
   }
   buildCounterUsageReport--;
   return o;
@@ -404,19 +404,19 @@
     checkUsageReportEntity(o.entity);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed788(o.parameters);
+    checkUnnamed396(o.parameters);
   }
   buildCounterUsageReport--;
 }
 
-buildUnnamed789() {
+buildUnnamed397() {
   var o = new core.List<api.UsageReport>();
   o.add(buildUsageReport());
   o.add(buildUsageReport());
   return o;
 }
 
-checkUnnamed789(core.List<api.UsageReport> o) {
+checkUnnamed397(core.List<api.UsageReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReport(o[0]);
   checkUsageReport(o[1]);
@@ -443,14 +443,14 @@
   buildCounterUsageReportsWarningsData--;
 }
 
-buildUnnamed790() {
+buildUnnamed398() {
   var o = new core.List<api.UsageReportsWarningsData>();
   o.add(buildUsageReportsWarningsData());
   o.add(buildUsageReportsWarningsData());
   return o;
 }
 
-checkUnnamed790(core.List<api.UsageReportsWarningsData> o) {
+checkUnnamed398(core.List<api.UsageReportsWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarningsData(o[0]);
   checkUsageReportsWarningsData(o[1]);
@@ -462,7 +462,7 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed790();
+    o.data = buildUnnamed398();
     o.message = "foo";
   }
   buildCounterUsageReportsWarnings--;
@@ -473,20 +473,20 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed790(o.data);
+    checkUnnamed398(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterUsageReportsWarnings--;
 }
 
-buildUnnamed791() {
+buildUnnamed399() {
   var o = new core.List<api.UsageReportsWarnings>();
   o.add(buildUsageReportsWarnings());
   o.add(buildUsageReportsWarnings());
   return o;
 }
 
-checkUnnamed791(core.List<api.UsageReportsWarnings> o) {
+checkUnnamed399(core.List<api.UsageReportsWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarnings(o[0]);
   checkUsageReportsWarnings(o[1]);
@@ -500,8 +500,8 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.usageReports = buildUnnamed789();
-    o.warnings = buildUnnamed791();
+    o.usageReports = buildUnnamed397();
+    o.warnings = buildUnnamed399();
   }
   buildCounterUsageReports--;
   return o;
@@ -513,8 +513,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed789(o.usageReports);
-    checkUnnamed791(o.warnings);
+    checkUnnamed397(o.usageReports);
+    checkUnnamed399(o.warnings);
   }
   buildCounterUsageReports--;
 }
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index e3ccfa0..25f6496 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed510() {
+buildUnnamed841() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed510(core.List<api.Account> o) {
+checkUnnamed841(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -38,7 +38,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.premium = true;
-    o.subAccounts = buildUnnamed510();
+    o.subAccounts = buildUnnamed841();
     o.timezone = "foo";
   }
   buildCounterAccount--;
@@ -52,20 +52,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.premium, unittest.isTrue);
-    checkUnnamed510(o.subAccounts);
+    checkUnnamed841(o.subAccounts);
     unittest.expect(o.timezone, unittest.equals('foo'));
   }
   buildCounterAccount--;
 }
 
-buildUnnamed511() {
+buildUnnamed842() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed511(core.List<api.Account> o) {
+checkUnnamed842(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -77,7 +77,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed511();
+    o.items = buildUnnamed842();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -89,7 +89,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed511(o.items);
+    checkUnnamed842(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -125,14 +125,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed512() {
+buildUnnamed843() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed512(core.List<api.AdClient> o) {
+checkUnnamed843(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -144,7 +144,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed512();
+    o.items = buildUnnamed843();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -156,7 +156,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed512(o.items);
+    checkUnnamed843(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -390,14 +390,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed513() {
+buildUnnamed844() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed513(core.List<api.AdUnit> o) {
+checkUnnamed844(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -409,7 +409,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed513();
+    o.items = buildUnnamed844();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -421,21 +421,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed513(o.items);
+    checkUnnamed844(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed514() {
+buildUnnamed845() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed514(core.List<core.String> o) {
+checkUnnamed845(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -464,66 +464,66 @@
   buildCounterAdsenseReportsGenerateResponseHeaders--;
 }
 
-buildUnnamed515() {
+buildUnnamed846() {
   var o = new core.List<api.AdsenseReportsGenerateResponseHeaders>();
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   return o;
 }
 
-checkUnnamed515(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
+checkUnnamed846(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdsenseReportsGenerateResponseHeaders(o[0]);
   checkAdsenseReportsGenerateResponseHeaders(o[1]);
 }
 
-buildUnnamed516() {
+buildUnnamed847() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed516(core.List<core.String> o) {
+checkUnnamed847(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed517() {
+buildUnnamed848() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed516());
-  o.add(buildUnnamed516());
+  o.add(buildUnnamed847());
+  o.add(buildUnnamed847());
   return o;
 }
 
-checkUnnamed517(core.List<core.List<core.String>> o) {
+checkUnnamed848(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed516(o[0]);
-  checkUnnamed516(o[1]);
+  checkUnnamed847(o[0]);
+  checkUnnamed847(o[1]);
 }
 
-buildUnnamed518() {
+buildUnnamed849() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed518(core.List<core.String> o) {
+checkUnnamed849(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed519() {
+buildUnnamed850() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed519(core.List<core.String> o) {
+checkUnnamed850(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -534,15 +534,15 @@
   var o = new api.AdsenseReportsGenerateResponse();
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    o.averages = buildUnnamed514();
+    o.averages = buildUnnamed845();
     o.endDate = "foo";
-    o.headers = buildUnnamed515();
+    o.headers = buildUnnamed846();
     o.kind = "foo";
-    o.rows = buildUnnamed517();
+    o.rows = buildUnnamed848();
     o.startDate = "foo";
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed518();
-    o.warnings = buildUnnamed519();
+    o.totals = buildUnnamed849();
+    o.warnings = buildUnnamed850();
   }
   buildCounterAdsenseReportsGenerateResponse--;
   return o;
@@ -551,15 +551,15 @@
 checkAdsenseReportsGenerateResponse(api.AdsenseReportsGenerateResponse o) {
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    checkUnnamed514(o.averages);
+    checkUnnamed845(o.averages);
     unittest.expect(o.endDate, unittest.equals('foo'));
-    checkUnnamed515(o.headers);
+    checkUnnamed846(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed517(o.rows);
+    checkUnnamed848(o.rows);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed518(o.totals);
-    checkUnnamed519(o.warnings);
+    checkUnnamed849(o.totals);
+    checkUnnamed850(o.warnings);
   }
   buildCounterAdsenseReportsGenerateResponse--;
 }
@@ -593,14 +593,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed520() {
+buildUnnamed851() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed520(core.List<api.Alert> o) {
+checkUnnamed851(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -611,7 +611,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed520();
+    o.items = buildUnnamed851();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -621,7 +621,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed520(o.items);
+    checkUnnamed851(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -679,14 +679,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed521() {
+buildUnnamed852() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed521(core.List<api.CustomChannel> o) {
+checkUnnamed852(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -698,7 +698,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed521();
+    o.items = buildUnnamed852();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -710,21 +710,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed521(o.items);
+    checkUnnamed852(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed522() {
+buildUnnamed853() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed522(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed853(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -735,7 +735,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed522();
+    o.items = buildUnnamed853();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -745,7 +745,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed522(o.items);
+    checkUnnamed853(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -778,14 +778,14 @@
   buildCounterPayment--;
 }
 
-buildUnnamed523() {
+buildUnnamed854() {
   var o = new core.List<api.Payment>();
   o.add(buildPayment());
   o.add(buildPayment());
   return o;
 }
 
-checkUnnamed523(core.List<api.Payment> o) {
+checkUnnamed854(core.List<api.Payment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPayment(o[0]);
   checkPayment(o[1]);
@@ -796,7 +796,7 @@
   var o = new api.Payments();
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    o.items = buildUnnamed523();
+    o.items = buildUnnamed854();
     o.kind = "foo";
   }
   buildCounterPayments--;
@@ -806,72 +806,72 @@
 checkPayments(api.Payments o) {
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    checkUnnamed523(o.items);
+    checkUnnamed854(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPayments--;
 }
 
-buildUnnamed524() {
+buildUnnamed855() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed524(core.List<core.String> o) {
+checkUnnamed855(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed525() {
+buildUnnamed856() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed525(core.List<core.String> o) {
+checkUnnamed856(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed526() {
+buildUnnamed857() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed526(core.List<core.String> o) {
+checkUnnamed857(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed527() {
+buildUnnamed858() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed527(core.List<core.String> o) {
+checkUnnamed858(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed528() {
+buildUnnamed859() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed528(core.List<core.String> o) {
+checkUnnamed859(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -882,13 +882,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed524();
-    o.compatibleMetrics = buildUnnamed525();
+    o.compatibleDimensions = buildUnnamed855();
+    o.compatibleMetrics = buildUnnamed856();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed526();
-    o.requiredMetrics = buildUnnamed527();
-    o.supportedProducts = buildUnnamed528();
+    o.requiredDimensions = buildUnnamed857();
+    o.requiredMetrics = buildUnnamed858();
+    o.supportedProducts = buildUnnamed859();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -897,13 +897,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed524(o.compatibleDimensions);
-    checkUnnamed525(o.compatibleMetrics);
+    checkUnnamed855(o.compatibleDimensions);
+    checkUnnamed856(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed526(o.requiredDimensions);
-    checkUnnamed527(o.requiredMetrics);
-    checkUnnamed528(o.supportedProducts);
+    checkUnnamed857(o.requiredDimensions);
+    checkUnnamed858(o.requiredMetrics);
+    checkUnnamed859(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -933,14 +933,14 @@
   buildCounterSavedAdStyle--;
 }
 
-buildUnnamed529() {
+buildUnnamed860() {
   var o = new core.List<api.SavedAdStyle>();
   o.add(buildSavedAdStyle());
   o.add(buildSavedAdStyle());
   return o;
 }
 
-checkUnnamed529(core.List<api.SavedAdStyle> o) {
+checkUnnamed860(core.List<api.SavedAdStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedAdStyle(o[0]);
   checkSavedAdStyle(o[1]);
@@ -952,7 +952,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed529();
+    o.items = buildUnnamed860();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -964,7 +964,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed529(o.items);
+    checkUnnamed860(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -994,14 +994,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed530() {
+buildUnnamed861() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed530(core.List<api.SavedReport> o) {
+checkUnnamed861(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -1013,7 +1013,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed530();
+    o.items = buildUnnamed861();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1025,7 +1025,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed530(o.items);
+    checkUnnamed861(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1055,14 +1055,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed531() {
+buildUnnamed862() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed531(core.List<api.UrlChannel> o) {
+checkUnnamed862(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -1074,7 +1074,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed531();
+    o.items = buildUnnamed862();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1086,125 +1086,125 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed531(o.items);
+    checkUnnamed862(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed532() {
+buildUnnamed863() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed532(core.List<core.String> o) {
+checkUnnamed863(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed533() {
+buildUnnamed864() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed533(core.List<core.String> o) {
+checkUnnamed864(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed534() {
+buildUnnamed865() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed534(core.List<core.String> o) {
+checkUnnamed865(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed535() {
+buildUnnamed866() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed535(core.List<core.String> o) {
+checkUnnamed866(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed536() {
+buildUnnamed867() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed536(core.List<core.String> o) {
+checkUnnamed867(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed537() {
+buildUnnamed868() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed537(core.List<core.String> o) {
+checkUnnamed868(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed538() {
+buildUnnamed869() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed538(core.List<core.String> o) {
+checkUnnamed869(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed539() {
+buildUnnamed870() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed539(core.List<core.String> o) {
+checkUnnamed870(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed540() {
+buildUnnamed871() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed540(core.List<core.String> o) {
+checkUnnamed871(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2333,12 +2333,12 @@
       var arg_startDate = "foo";
       var arg_endDate = "foo";
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed532();
-      var arg_filter = buildUnnamed533();
+      var arg_dimension = buildUnnamed863();
+      var arg_filter = buildUnnamed864();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed534();
-      var arg_sort = buildUnnamed535();
+      var arg_metric = buildUnnamed865();
+      var arg_sort = buildUnnamed866();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -3460,14 +3460,14 @@
       api.ReportsResourceApi res = new api.AdsenseApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_accountId = buildUnnamed536();
+      var arg_accountId = buildUnnamed867();
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed537();
-      var arg_filter = buildUnnamed538();
+      var arg_dimension = buildUnnamed868();
+      var arg_filter = buildUnnamed869();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed539();
-      var arg_sort = buildUnnamed540();
+      var arg_metric = buildUnnamed870();
+      var arg_sort = buildUnnamed871();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index 1101d9a..9bd2249 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed606() {
+buildUnnamed1043() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed606(core.List<api.Account> o) {
+checkUnnamed1043(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -60,7 +60,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed606();
+    o.items = buildUnnamed1043();
     o.kind = "foo";
   }
   buildCounterAccounts--;
@@ -71,7 +71,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed606(o.items);
+    checkUnnamed1043(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccounts--;
@@ -104,14 +104,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed607() {
+buildUnnamed1044() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed607(core.List<api.AdClient> o) {
+checkUnnamed1044(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -123,7 +123,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed607();
+    o.items = buildUnnamed1044();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,7 +135,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed607(o.items);
+    checkUnnamed1044(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -340,14 +340,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed608() {
+buildUnnamed1045() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed608(core.List<api.AdUnit> o) {
+checkUnnamed1045(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -359,7 +359,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed608();
+    o.items = buildUnnamed1045();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -371,21 +371,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed608(o.items);
+    checkUnnamed1045(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed609() {
+buildUnnamed1046() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed609(core.List<core.String> o) {
+checkUnnamed1046(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -399,7 +399,7 @@
     o.accountId = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.productCodes = buildUnnamed609();
+    o.productCodes = buildUnnamed1046();
     o.redirectUrl = "foo";
     o.status = "foo";
     o.userLocale = "foo";
@@ -416,7 +416,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed609(o.productCodes);
+    checkUnnamed1046(o.productCodes);
     unittest.expect(o.redirectUrl, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userLocale, unittest.equals('foo'));
@@ -451,14 +451,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed610() {
+buildUnnamed1047() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed610(core.List<api.CustomChannel> o) {
+checkUnnamed1047(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -470,7 +470,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed610();
+    o.items = buildUnnamed1047();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -482,21 +482,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed610(o.items);
+    checkUnnamed1047(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed611() {
+buildUnnamed1048() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed611(core.List<core.String> o) {
+checkUnnamed1048(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -525,66 +525,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed612() {
+buildUnnamed1049() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed612(core.List<api.ReportHeaders> o) {
+checkUnnamed1049(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed613() {
+buildUnnamed1050() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed613(core.List<core.String> o) {
+checkUnnamed1050(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed614() {
+buildUnnamed1051() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed613());
-  o.add(buildUnnamed613());
+  o.add(buildUnnamed1050());
+  o.add(buildUnnamed1050());
   return o;
 }
 
-checkUnnamed614(core.List<core.List<core.String>> o) {
+checkUnnamed1051(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed613(o[0]);
-  checkUnnamed613(o[1]);
+  checkUnnamed1050(o[0]);
+  checkUnnamed1050(o[1]);
 }
 
-buildUnnamed615() {
+buildUnnamed1052() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed615(core.List<core.String> o) {
+checkUnnamed1052(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed616() {
+buildUnnamed1053() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed616(core.List<core.String> o) {
+checkUnnamed1053(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -595,13 +595,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed611();
-    o.headers = buildUnnamed612();
+    o.averages = buildUnnamed1048();
+    o.headers = buildUnnamed1049();
     o.kind = "foo";
-    o.rows = buildUnnamed614();
+    o.rows = buildUnnamed1051();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed615();
-    o.warnings = buildUnnamed616();
+    o.totals = buildUnnamed1052();
+    o.warnings = buildUnnamed1053();
   }
   buildCounterReport--;
   return o;
@@ -610,13 +610,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed611(o.averages);
-    checkUnnamed612(o.headers);
+    checkUnnamed1048(o.averages);
+    checkUnnamed1049(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed614(o.rows);
+    checkUnnamed1051(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed615(o.totals);
-    checkUnnamed616(o.warnings);
+    checkUnnamed1052(o.totals);
+    checkUnnamed1053(o.warnings);
   }
   buildCounterReport--;
 }
@@ -644,14 +644,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed617() {
+buildUnnamed1054() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed617(core.List<api.UrlChannel> o) {
+checkUnnamed1054(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -663,7 +663,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed617();
+    o.items = buildUnnamed1054();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -675,151 +675,151 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed617(o.items);
+    checkUnnamed1054(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed618() {
+buildUnnamed1055() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed618(core.List<core.String> o) {
+checkUnnamed1055(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed619() {
+buildUnnamed1056() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed619(core.List<core.String> o) {
+checkUnnamed1056(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed620() {
+buildUnnamed1057() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed620(core.List<core.String> o) {
+checkUnnamed1057(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed621() {
+buildUnnamed1058() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed621(core.List<core.String> o) {
+checkUnnamed1058(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed622() {
+buildUnnamed1059() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed622(core.List<core.String> o) {
+checkUnnamed1059(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed623() {
+buildUnnamed1060() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed623(core.List<core.String> o) {
+checkUnnamed1060(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed624() {
+buildUnnamed1061() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed624(core.List<core.String> o) {
+checkUnnamed1061(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed625() {
+buildUnnamed1062() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed625(core.List<core.String> o) {
+checkUnnamed1062(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed626() {
+buildUnnamed1063() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed626(core.List<core.String> o) {
+checkUnnamed1063(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed627() {
+buildUnnamed1064() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed627(core.List<core.String> o) {
+checkUnnamed1064(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed628() {
+buildUnnamed1065() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed628(core.List<core.String> o) {
+checkUnnamed1065(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1061,7 +1061,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.AccountsResourceApi res = new api.AdsensehostApi(mock).accounts;
-      var arg_filterAdClientId = buildUnnamed618();
+      var arg_filterAdClientId = buildUnnamed1055();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1363,7 +1363,7 @@
       var arg_accountId = "foo";
       var arg_adClientId = "foo";
       var arg_adUnitId = "foo";
-      var arg_hostCustomChannelId = buildUnnamed619();
+      var arg_hostCustomChannelId = buildUnnamed1056();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1702,12 +1702,12 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed620();
-      var arg_filter = buildUnnamed621();
+      var arg_dimension = buildUnnamed1057();
+      var arg_filter = buildUnnamed1058();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed622();
-      var arg_sort = buildUnnamed623();
+      var arg_metric = buildUnnamed1059();
+      var arg_sort = buildUnnamed1060();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1876,7 +1876,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.AssociationsessionsResourceApi res = new api.AdsensehostApi(mock).associationsessions;
-      var arg_productCode = buildUnnamed624();
+      var arg_productCode = buildUnnamed1061();
       var arg_websiteUrl = "foo";
       var arg_userLocale = "foo";
       var arg_websiteLocale = "foo";
@@ -2330,12 +2330,12 @@
       api.ReportsResourceApi res = new api.AdsensehostApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed625();
-      var arg_filter = buildUnnamed626();
+      var arg_dimension = buildUnnamed1062();
+      var arg_filter = buildUnnamed1063();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed627();
-      var arg_sort = buildUnnamed628();
+      var arg_metric = buildUnnamed1064();
+      var arg_sort = buildUnnamed1065();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index ecd55d4..9c470bc 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -37,14 +37,14 @@
   buildCounterAccountChildLink--;
 }
 
-buildUnnamed5() {
+buildUnnamed592() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed5(core.List<core.String> o) {
+checkUnnamed592(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.AccountPermissions();
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    o.effective = buildUnnamed5();
+    o.effective = buildUnnamed592();
   }
   buildCounterAccountPermissions--;
   return o;
@@ -64,7 +64,7 @@
 checkAccountPermissions(api.AccountPermissions o) {
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    checkUnnamed5(o.effective);
+    checkUnnamed592(o.effective);
   }
   buildCounterAccountPermissions--;
 }
@@ -127,14 +127,14 @@
   buildCounterAccountRef--;
 }
 
-buildUnnamed6() {
+buildUnnamed593() {
   var o = new core.List<api.AccountSummary>();
   o.add(buildAccountSummary());
   o.add(buildAccountSummary());
   return o;
 }
 
-checkUnnamed6(core.List<api.AccountSummary> o) {
+checkUnnamed593(core.List<api.AccountSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountSummary(o[0]);
   checkAccountSummary(o[1]);
@@ -145,7 +145,7 @@
   var o = new api.AccountSummaries();
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    o.items = buildUnnamed6();
+    o.items = buildUnnamed593();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -161,7 +161,7 @@
 checkAccountSummaries(api.AccountSummaries o) {
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    checkUnnamed6(o.items);
+    checkUnnamed593(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -173,14 +173,14 @@
   buildCounterAccountSummaries--;
 }
 
-buildUnnamed7() {
+buildUnnamed594() {
   var o = new core.List<api.WebPropertySummary>();
   o.add(buildWebPropertySummary());
   o.add(buildWebPropertySummary());
   return o;
 }
 
-checkUnnamed7(core.List<api.WebPropertySummary> o) {
+checkUnnamed594(core.List<api.WebPropertySummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPropertySummary(o[0]);
   checkWebPropertySummary(o[1]);
@@ -194,7 +194,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.webProperties = buildUnnamed7();
+    o.webProperties = buildUnnamed594();
   }
   buildCounterAccountSummary--;
   return o;
@@ -206,7 +206,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed7(o.webProperties);
+    checkUnnamed594(o.webProperties);
   }
   buildCounterAccountSummary--;
 }
@@ -240,14 +240,14 @@
   buildCounterAccountTicket--;
 }
 
-buildUnnamed8() {
+buildUnnamed595() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed8(core.List<api.Account> o) {
+checkUnnamed595(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -258,7 +258,7 @@
   var o = new api.Accounts();
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    o.items = buildUnnamed8();
+    o.items = buildUnnamed595();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -274,7 +274,7 @@
 checkAccounts(api.Accounts o) {
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    checkUnnamed8(o.items);
+    checkUnnamed595(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -309,14 +309,14 @@
   buildCounterAdWordsAccount--;
 }
 
-buildUnnamed9() {
+buildUnnamed596() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed9(core.List<core.String> o) {
+checkUnnamed596(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -327,7 +327,7 @@
   var o = new api.AnalyticsDataimportDeleteUploadDataRequest();
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    o.customDataImportUids = buildUnnamed9();
+    o.customDataImportUids = buildUnnamed596();
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
   return o;
@@ -336,19 +336,19 @@
 checkAnalyticsDataimportDeleteUploadDataRequest(api.AnalyticsDataimportDeleteUploadDataRequest o) {
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    checkUnnamed9(o.customDataImportUids);
+    checkUnnamed596(o.customDataImportUids);
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
 }
 
-buildUnnamed10() {
+buildUnnamed597() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed10(core.Map<core.String, core.String> o) {
+checkUnnamed597(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -359,7 +359,7 @@
   var o = new api.Column();
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    o.attributes = buildUnnamed10();
+    o.attributes = buildUnnamed597();
     o.id = "foo";
     o.kind = "foo";
   }
@@ -370,34 +370,34 @@
 checkColumn(api.Column o) {
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    checkUnnamed10(o.attributes);
+    checkUnnamed597(o.attributes);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterColumn--;
 }
 
-buildUnnamed11() {
+buildUnnamed598() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed11(core.List<core.String> o) {
+checkUnnamed598(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed12() {
+buildUnnamed599() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed12(core.List<api.Column> o) {
+checkUnnamed599(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -408,9 +408,9 @@
   var o = new api.Columns();
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    o.attributeNames = buildUnnamed11();
+    o.attributeNames = buildUnnamed598();
     o.etag = "foo";
-    o.items = buildUnnamed12();
+    o.items = buildUnnamed599();
     o.kind = "foo";
     o.totalResults = 42;
   }
@@ -421,9 +421,9 @@
 checkColumns(api.Columns o) {
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    checkUnnamed11(o.attributeNames);
+    checkUnnamed598(o.attributeNames);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed12(o.items);
+    checkUnnamed599(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
   }
@@ -472,14 +472,14 @@
   buildCounterCustomDataSourceParentLink--;
 }
 
-buildUnnamed13() {
+buildUnnamed600() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed13(core.List<core.String> o) {
+checkUnnamed600(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -499,7 +499,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentLink = buildCustomDataSourceParentLink();
-    o.profilesLinked = buildUnnamed13();
+    o.profilesLinked = buildUnnamed600();
     o.selfLink = "foo";
     o.type = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -522,7 +522,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkCustomDataSourceParentLink(o.parentLink);
-    checkUnnamed13(o.profilesLinked);
+    checkUnnamed600(o.profilesLinked);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -532,14 +532,14 @@
   buildCounterCustomDataSource--;
 }
 
-buildUnnamed14() {
+buildUnnamed601() {
   var o = new core.List<api.CustomDataSource>();
   o.add(buildCustomDataSource());
   o.add(buildCustomDataSource());
   return o;
 }
 
-checkUnnamed14(core.List<api.CustomDataSource> o) {
+checkUnnamed601(core.List<api.CustomDataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDataSource(o[0]);
   checkCustomDataSource(o[1]);
@@ -550,7 +550,7 @@
   var o = new api.CustomDataSources();
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    o.items = buildUnnamed14();
+    o.items = buildUnnamed601();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -566,7 +566,7 @@
 checkCustomDataSources(api.CustomDataSources o) {
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    checkUnnamed14(o.items);
+    checkUnnamed601(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -620,14 +620,14 @@
   buildCounterDailyUploadRecentChanges--;
 }
 
-buildUnnamed15() {
+buildUnnamed602() {
   var o = new core.List<api.DailyUploadRecentChanges>();
   o.add(buildDailyUploadRecentChanges());
   o.add(buildDailyUploadRecentChanges());
   return o;
 }
 
-checkUnnamed15(core.List<api.DailyUploadRecentChanges> o) {
+checkUnnamed602(core.List<api.DailyUploadRecentChanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUploadRecentChanges(o[0]);
   checkDailyUploadRecentChanges(o[1]);
@@ -646,7 +646,7 @@
     o.kind = "foo";
     o.modifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.parentLink = buildDailyUploadParentLink();
-    o.recentChanges = buildUnnamed15();
+    o.recentChanges = buildUnnamed602();
     o.selfLink = "foo";
     o.webPropertyId = "foo";
   }
@@ -665,7 +665,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkDailyUploadParentLink(o.parentLink);
-    checkUnnamed15(o.recentChanges);
+    checkUnnamed602(o.recentChanges);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
@@ -703,14 +703,14 @@
   buildCounterDailyUploadAppend--;
 }
 
-buildUnnamed16() {
+buildUnnamed603() {
   var o = new core.List<api.DailyUpload>();
   o.add(buildDailyUpload());
   o.add(buildDailyUpload());
   return o;
 }
 
-checkUnnamed16(core.List<api.DailyUpload> o) {
+checkUnnamed603(core.List<api.DailyUpload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUpload(o[0]);
   checkDailyUpload(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.DailyUploads();
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    o.items = buildUnnamed16();
+    o.items = buildUnnamed603();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -737,7 +737,7 @@
 checkDailyUploads(api.DailyUploads o) {
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    checkUnnamed16(o.items);
+    checkUnnamed603(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -749,14 +749,14 @@
   buildCounterDailyUploads--;
 }
 
-buildUnnamed17() {
+buildUnnamed604() {
   var o = new core.List<api.AdWordsAccount>();
   o.add(buildAdWordsAccount());
   o.add(buildAdWordsAccount());
   return o;
 }
 
-checkUnnamed17(core.List<api.AdWordsAccount> o) {
+checkUnnamed604(core.List<api.AdWordsAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdWordsAccount(o[0]);
   checkAdWordsAccount(o[1]);
@@ -781,14 +781,14 @@
   buildCounterEntityAdWordsLinkEntity--;
 }
 
-buildUnnamed18() {
+buildUnnamed605() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed18(core.List<core.String> o) {
+checkUnnamed605(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -799,12 +799,12 @@
   var o = new api.EntityAdWordsLink();
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    o.adWordsAccounts = buildUnnamed17();
+    o.adWordsAccounts = buildUnnamed604();
     o.entity = buildEntityAdWordsLinkEntity();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.profileIds = buildUnnamed18();
+    o.profileIds = buildUnnamed605();
     o.selfLink = "foo";
   }
   buildCounterEntityAdWordsLink--;
@@ -814,25 +814,25 @@
 checkEntityAdWordsLink(api.EntityAdWordsLink o) {
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    checkUnnamed17(o.adWordsAccounts);
+    checkUnnamed604(o.adWordsAccounts);
     checkEntityAdWordsLinkEntity(o.entity);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed18(o.profileIds);
+    checkUnnamed605(o.profileIds);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterEntityAdWordsLink--;
 }
 
-buildUnnamed19() {
+buildUnnamed606() {
   var o = new core.List<api.EntityAdWordsLink>();
   o.add(buildEntityAdWordsLink());
   o.add(buildEntityAdWordsLink());
   return o;
 }
 
-checkUnnamed19(core.List<api.EntityAdWordsLink> o) {
+checkUnnamed606(core.List<api.EntityAdWordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAdWordsLink(o[0]);
   checkEntityAdWordsLink(o[1]);
@@ -843,7 +843,7 @@
   var o = new api.EntityAdWordsLinks();
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    o.items = buildUnnamed19();
+    o.items = buildUnnamed606();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -858,7 +858,7 @@
 checkEntityAdWordsLinks(api.EntityAdWordsLinks o) {
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    checkUnnamed19(o.items);
+    checkUnnamed606(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -892,27 +892,27 @@
   buildCounterEntityUserLinkEntity--;
 }
 
-buildUnnamed20() {
+buildUnnamed607() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed20(core.List<core.String> o) {
+checkUnnamed607(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed21() {
+buildUnnamed608() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed21(core.List<core.String> o) {
+checkUnnamed608(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -923,8 +923,8 @@
   var o = new api.EntityUserLinkPermissions();
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    o.effective = buildUnnamed20();
-    o.local = buildUnnamed21();
+    o.effective = buildUnnamed607();
+    o.local = buildUnnamed608();
   }
   buildCounterEntityUserLinkPermissions--;
   return o;
@@ -933,8 +933,8 @@
 checkEntityUserLinkPermissions(api.EntityUserLinkPermissions o) {
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    checkUnnamed20(o.effective);
-    checkUnnamed21(o.local);
+    checkUnnamed607(o.effective);
+    checkUnnamed608(o.local);
   }
   buildCounterEntityUserLinkPermissions--;
 }
@@ -968,14 +968,14 @@
   buildCounterEntityUserLink--;
 }
 
-buildUnnamed22() {
+buildUnnamed609() {
   var o = new core.List<api.EntityUserLink>();
   o.add(buildEntityUserLink());
   o.add(buildEntityUserLink());
   return o;
 }
 
-checkUnnamed22(core.List<api.EntityUserLink> o) {
+checkUnnamed609(core.List<api.EntityUserLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityUserLink(o[0]);
   checkEntityUserLink(o[1]);
@@ -986,7 +986,7 @@
   var o = new api.EntityUserLinks();
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    o.items = buildUnnamed22();
+    o.items = buildUnnamed609();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1001,7 +1001,7 @@
 checkEntityUserLinks(api.EntityUserLinks o) {
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    checkUnnamed22(o.items);
+    checkUnnamed609(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1060,14 +1060,14 @@
   buildCounterExperimentVariations--;
 }
 
-buildUnnamed23() {
+buildUnnamed610() {
   var o = new core.List<api.ExperimentVariations>();
   o.add(buildExperimentVariations());
   o.add(buildExperimentVariations());
   return o;
 }
 
-checkUnnamed23(core.List<api.ExperimentVariations> o) {
+checkUnnamed610(core.List<api.ExperimentVariations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperimentVariations(o[0]);
   checkExperimentVariations(o[1]);
@@ -1102,7 +1102,7 @@
     o.status = "foo";
     o.trafficCoverage = 42.0;
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
-    o.variations = buildUnnamed23();
+    o.variations = buildUnnamed610();
     o.webPropertyId = "foo";
     o.winnerConfidenceLevel = 42.0;
     o.winnerFound = true;
@@ -1138,7 +1138,7 @@
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trafficCoverage, unittest.equals(42.0));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed23(o.variations);
+    checkUnnamed610(o.variations);
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
     unittest.expect(o.winnerConfidenceLevel, unittest.equals(42.0));
     unittest.expect(o.winnerFound, unittest.isTrue);
@@ -1146,14 +1146,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed24() {
+buildUnnamed611() {
   var o = new core.List<api.Experiment>();
   o.add(buildExperiment());
   o.add(buildExperiment());
   return o;
 }
 
-checkUnnamed24(core.List<api.Experiment> o) {
+checkUnnamed611(core.List<api.Experiment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperiment(o[0]);
   checkExperiment(o[1]);
@@ -1164,7 +1164,7 @@
   var o = new api.Experiments();
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    o.items = buildUnnamed24();
+    o.items = buildUnnamed611();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1180,7 +1180,7 @@
 checkExperiments(api.Experiments o) {
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    checkUnnamed24(o.items);
+    checkUnnamed611(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1414,14 +1414,14 @@
   buildCounterFilterRef--;
 }
 
-buildUnnamed25() {
+buildUnnamed612() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed25(core.List<api.Filter> o) {
+checkUnnamed612(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -1432,7 +1432,7 @@
   var o = new api.Filters();
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    o.items = buildUnnamed25();
+    o.items = buildUnnamed612();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1448,7 +1448,7 @@
 checkFilters(api.Filters o) {
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    checkUnnamed25(o.items);
+    checkUnnamed612(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1483,14 +1483,14 @@
   buildCounterGaDataColumnHeaders--;
 }
 
-buildUnnamed26() {
+buildUnnamed613() {
   var o = new core.List<api.GaDataColumnHeaders>();
   o.add(buildGaDataColumnHeaders());
   o.add(buildGaDataColumnHeaders());
   return o;
 }
 
-checkUnnamed26(core.List<api.GaDataColumnHeaders> o) {
+checkUnnamed613(core.List<api.GaDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataColumnHeaders(o[0]);
   checkGaDataColumnHeaders(o[1]);
@@ -1519,14 +1519,14 @@
   buildCounterGaDataDataTableCols--;
 }
 
-buildUnnamed27() {
+buildUnnamed614() {
   var o = new core.List<api.GaDataDataTableCols>();
   o.add(buildGaDataDataTableCols());
   o.add(buildGaDataDataTableCols());
   return o;
 }
 
-checkUnnamed27(core.List<api.GaDataDataTableCols> o) {
+checkUnnamed614(core.List<api.GaDataDataTableCols> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableCols(o[0]);
   checkGaDataDataTableCols(o[1]);
@@ -1551,14 +1551,14 @@
   buildCounterGaDataDataTableRowsC--;
 }
 
-buildUnnamed28() {
+buildUnnamed615() {
   var o = new core.List<api.GaDataDataTableRowsC>();
   o.add(buildGaDataDataTableRowsC());
   o.add(buildGaDataDataTableRowsC());
   return o;
 }
 
-checkUnnamed28(core.List<api.GaDataDataTableRowsC> o) {
+checkUnnamed615(core.List<api.GaDataDataTableRowsC> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRowsC(o[0]);
   checkGaDataDataTableRowsC(o[1]);
@@ -1569,7 +1569,7 @@
   var o = new api.GaDataDataTableRows();
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    o.c = buildUnnamed28();
+    o.c = buildUnnamed615();
   }
   buildCounterGaDataDataTableRows--;
   return o;
@@ -1578,19 +1578,19 @@
 checkGaDataDataTableRows(api.GaDataDataTableRows o) {
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    checkUnnamed28(o.c);
+    checkUnnamed615(o.c);
   }
   buildCounterGaDataDataTableRows--;
 }
 
-buildUnnamed29() {
+buildUnnamed616() {
   var o = new core.List<api.GaDataDataTableRows>();
   o.add(buildGaDataDataTableRows());
   o.add(buildGaDataDataTableRows());
   return o;
 }
 
-checkUnnamed29(core.List<api.GaDataDataTableRows> o) {
+checkUnnamed616(core.List<api.GaDataDataTableRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRows(o[0]);
   checkGaDataDataTableRows(o[1]);
@@ -1601,8 +1601,8 @@
   var o = new api.GaDataDataTable();
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    o.cols = buildUnnamed27();
-    o.rows = buildUnnamed29();
+    o.cols = buildUnnamed614();
+    o.rows = buildUnnamed616();
   }
   buildCounterGaDataDataTable--;
   return o;
@@ -1611,8 +1611,8 @@
 checkGaDataDataTable(api.GaDataDataTable o) {
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    checkUnnamed27(o.cols);
-    checkUnnamed29(o.rows);
+    checkUnnamed614(o.cols);
+    checkUnnamed616(o.rows);
   }
   buildCounterGaDataDataTable--;
 }
@@ -1646,27 +1646,27 @@
   buildCounterGaDataProfileInfo--;
 }
 
-buildUnnamed30() {
+buildUnnamed617() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed30(core.List<core.String> o) {
+checkUnnamed617(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed31() {
+buildUnnamed618() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed31(core.List<core.String> o) {
+checkUnnamed618(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1682,10 +1682,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed30();
+    o.metrics = buildUnnamed617();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed31();
+    o.sort = buildUnnamed618();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -1701,50 +1701,50 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed30(o.metrics);
+    checkUnnamed617(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed31(o.sort);
+    checkUnnamed618(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
   buildCounterGaDataQuery--;
 }
 
-buildUnnamed32() {
+buildUnnamed619() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed32(core.List<core.String> o) {
+checkUnnamed619(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed33() {
+buildUnnamed620() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed32());
-  o.add(buildUnnamed32());
+  o.add(buildUnnamed619());
+  o.add(buildUnnamed619());
   return o;
 }
 
-checkUnnamed33(core.List<core.List<core.String>> o) {
+checkUnnamed620(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed32(o[0]);
-  checkUnnamed32(o[1]);
+  checkUnnamed619(o[0]);
+  checkUnnamed619(o[1]);
 }
 
-buildUnnamed34() {
+buildUnnamed621() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed34(core.Map<core.String, core.String> o) {
+checkUnnamed621(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1755,7 +1755,7 @@
   var o = new api.GaData();
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    o.columnHeaders = buildUnnamed26();
+    o.columnHeaders = buildUnnamed613();
     o.containsSampledData = true;
     o.dataTable = buildGaDataDataTable();
     o.id = "foo";
@@ -1765,12 +1765,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildGaDataProfileInfo();
     o.query = buildGaDataQuery();
-    o.rows = buildUnnamed33();
+    o.rows = buildUnnamed620();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed34();
+    o.totalsForAllResults = buildUnnamed621();
   }
   buildCounterGaData--;
   return o;
@@ -1779,7 +1779,7 @@
 checkGaData(api.GaData o) {
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    checkUnnamed26(o.columnHeaders);
+    checkUnnamed613(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     checkGaDataDataTable(o.dataTable);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1789,12 +1789,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkGaDataProfileInfo(o.profileInfo);
     checkGaDataQuery(o.query);
-    checkUnnamed33(o.rows);
+    checkUnnamed620(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed34(o.totalsForAllResults);
+    checkUnnamed621(o.totalsForAllResults);
   }
   buildCounterGaData--;
 }
@@ -1826,14 +1826,14 @@
   buildCounterGoalEventDetailsEventConditions--;
 }
 
-buildUnnamed35() {
+buildUnnamed622() {
   var o = new core.List<api.GoalEventDetailsEventConditions>();
   o.add(buildGoalEventDetailsEventConditions());
   o.add(buildGoalEventDetailsEventConditions());
   return o;
 }
 
-checkUnnamed35(core.List<api.GoalEventDetailsEventConditions> o) {
+checkUnnamed622(core.List<api.GoalEventDetailsEventConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalEventDetailsEventConditions(o[0]);
   checkGoalEventDetailsEventConditions(o[1]);
@@ -1844,7 +1844,7 @@
   var o = new api.GoalEventDetails();
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    o.eventConditions = buildUnnamed35();
+    o.eventConditions = buildUnnamed622();
     o.useEventValue = true;
   }
   buildCounterGoalEventDetails--;
@@ -1854,7 +1854,7 @@
 checkGoalEventDetails(api.GoalEventDetails o) {
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    checkUnnamed35(o.eventConditions);
+    checkUnnamed622(o.eventConditions);
     unittest.expect(o.useEventValue, unittest.isTrue);
   }
   buildCounterGoalEventDetails--;
@@ -1904,14 +1904,14 @@
   buildCounterGoalUrlDestinationDetailsSteps--;
 }
 
-buildUnnamed36() {
+buildUnnamed623() {
   var o = new core.List<api.GoalUrlDestinationDetailsSteps>();
   o.add(buildGoalUrlDestinationDetailsSteps());
   o.add(buildGoalUrlDestinationDetailsSteps());
   return o;
 }
 
-checkUnnamed36(core.List<api.GoalUrlDestinationDetailsSteps> o) {
+checkUnnamed623(core.List<api.GoalUrlDestinationDetailsSteps> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalUrlDestinationDetailsSteps(o[0]);
   checkGoalUrlDestinationDetailsSteps(o[1]);
@@ -1925,7 +1925,7 @@
     o.caseSensitive = true;
     o.firstStepRequired = true;
     o.matchType = "foo";
-    o.steps = buildUnnamed36();
+    o.steps = buildUnnamed623();
     o.url = "foo";
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -1938,7 +1938,7 @@
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.firstStepRequired, unittest.isTrue);
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed36(o.steps);
+    checkUnnamed623(o.steps);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2039,14 +2039,14 @@
   buildCounterGoal--;
 }
 
-buildUnnamed37() {
+buildUnnamed624() {
   var o = new core.List<api.Goal>();
   o.add(buildGoal());
   o.add(buildGoal());
   return o;
 }
 
-checkUnnamed37(core.List<api.Goal> o) {
+checkUnnamed624(core.List<api.Goal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoal(o[0]);
   checkGoal(o[1]);
@@ -2057,7 +2057,7 @@
   var o = new api.Goals();
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    o.items = buildUnnamed37();
+    o.items = buildUnnamed624();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2073,7 +2073,7 @@
 checkGoals(api.Goals o) {
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    checkUnnamed37(o.items);
+    checkUnnamed624(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2108,14 +2108,14 @@
   buildCounterMcfDataColumnHeaders--;
 }
 
-buildUnnamed38() {
+buildUnnamed625() {
   var o = new core.List<api.McfDataColumnHeaders>();
   o.add(buildMcfDataColumnHeaders());
   o.add(buildMcfDataColumnHeaders());
   return o;
 }
 
-checkUnnamed38(core.List<api.McfDataColumnHeaders> o) {
+checkUnnamed625(core.List<api.McfDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataColumnHeaders(o[0]);
   checkMcfDataColumnHeaders(o[1]);
@@ -2150,27 +2150,27 @@
   buildCounterMcfDataProfileInfo--;
 }
 
-buildUnnamed39() {
+buildUnnamed626() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed39(core.List<core.String> o) {
+checkUnnamed626(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed40() {
+buildUnnamed627() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed40(core.List<core.String> o) {
+checkUnnamed627(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2186,10 +2186,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed39();
+    o.metrics = buildUnnamed626();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed40();
+    o.sort = buildUnnamed627();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -2205,10 +2205,10 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed39(o.metrics);
+    checkUnnamed626(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed40(o.sort);
+    checkUnnamed627(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
@@ -2236,14 +2236,14 @@
   buildCounterMcfDataRowsConversionPathValue--;
 }
 
-buildUnnamed41() {
+buildUnnamed628() {
   var o = new core.List<api.McfDataRowsConversionPathValue>();
   o.add(buildMcfDataRowsConversionPathValue());
   o.add(buildMcfDataRowsConversionPathValue());
   return o;
 }
 
-checkUnnamed41(core.List<api.McfDataRowsConversionPathValue> o) {
+checkUnnamed628(core.List<api.McfDataRowsConversionPathValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRowsConversionPathValue(o[0]);
   checkMcfDataRowsConversionPathValue(o[1]);
@@ -2254,7 +2254,7 @@
   var o = new api.McfDataRows();
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    o.conversionPathValue = buildUnnamed41();
+    o.conversionPathValue = buildUnnamed628();
     o.primitiveValue = "foo";
   }
   buildCounterMcfDataRows--;
@@ -2264,46 +2264,46 @@
 checkMcfDataRows(api.McfDataRows o) {
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    checkUnnamed41(o.conversionPathValue);
+    checkUnnamed628(o.conversionPathValue);
     unittest.expect(o.primitiveValue, unittest.equals('foo'));
   }
   buildCounterMcfDataRows--;
 }
 
-buildUnnamed42() {
+buildUnnamed629() {
   var o = new core.List<api.McfDataRows>();
   o.add(buildMcfDataRows());
   o.add(buildMcfDataRows());
   return o;
 }
 
-checkUnnamed42(core.List<api.McfDataRows> o) {
+checkUnnamed629(core.List<api.McfDataRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRows(o[0]);
   checkMcfDataRows(o[1]);
 }
 
-buildUnnamed43() {
+buildUnnamed630() {
   var o = new core.List<core.List<api.McfDataRows>>();
-  o.add(buildUnnamed42());
-  o.add(buildUnnamed42());
+  o.add(buildUnnamed629());
+  o.add(buildUnnamed629());
   return o;
 }
 
-checkUnnamed43(core.List<core.List<api.McfDataRows>> o) {
+checkUnnamed630(core.List<core.List<api.McfDataRows>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed42(o[0]);
-  checkUnnamed42(o[1]);
+  checkUnnamed629(o[0]);
+  checkUnnamed629(o[1]);
 }
 
-buildUnnamed44() {
+buildUnnamed631() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed44(core.Map<core.String, core.String> o) {
+checkUnnamed631(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2314,7 +2314,7 @@
   var o = new api.McfData();
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    o.columnHeaders = buildUnnamed38();
+    o.columnHeaders = buildUnnamed625();
     o.containsSampledData = true;
     o.id = "foo";
     o.itemsPerPage = 42;
@@ -2323,12 +2323,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildMcfDataProfileInfo();
     o.query = buildMcfDataQuery();
-    o.rows = buildUnnamed43();
+    o.rows = buildUnnamed630();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed44();
+    o.totalsForAllResults = buildUnnamed631();
   }
   buildCounterMcfData--;
   return o;
@@ -2337,7 +2337,7 @@
 checkMcfData(api.McfData o) {
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    checkUnnamed38(o.columnHeaders);
+    checkUnnamed625(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.itemsPerPage, unittest.equals(42));
@@ -2346,12 +2346,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkMcfDataProfileInfo(o.profileInfo);
     checkMcfDataQuery(o.query);
-    checkUnnamed43(o.rows);
+    checkUnnamed630(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed44(o.totalsForAllResults);
+    checkUnnamed631(o.totalsForAllResults);
   }
   buildCounterMcfData--;
 }
@@ -2398,14 +2398,14 @@
   buildCounterProfileParentLink--;
 }
 
-buildUnnamed45() {
+buildUnnamed632() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed45(core.List<core.String> o) {
+checkUnnamed632(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2416,7 +2416,7 @@
   var o = new api.ProfilePermissions();
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    o.effective = buildUnnamed45();
+    o.effective = buildUnnamed632();
   }
   buildCounterProfilePermissions--;
   return o;
@@ -2425,7 +2425,7 @@
 checkProfilePermissions(api.ProfilePermissions o) {
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    checkUnnamed45(o.effective);
+    checkUnnamed632(o.effective);
   }
   buildCounterProfilePermissions--;
 }
@@ -2441,6 +2441,7 @@
     o.currency = "foo";
     o.defaultPage = "foo";
     o.eCommerceTracking = true;
+    o.enhancedECommerceTracking = true;
     o.excludeQueryParameters = "foo";
     o.id = "foo";
     o.internalWebPropertyId = "foo";
@@ -2472,6 +2473,7 @@
     unittest.expect(o.currency, unittest.equals('foo'));
     unittest.expect(o.defaultPage, unittest.equals('foo'));
     unittest.expect(o.eCommerceTracking, unittest.isTrue);
+    unittest.expect(o.enhancedECommerceTracking, unittest.isTrue);
     unittest.expect(o.excludeQueryParameters, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalWebPropertyId, unittest.equals('foo'));
@@ -2522,14 +2524,14 @@
   buildCounterProfileFilterLink--;
 }
 
-buildUnnamed46() {
+buildUnnamed633() {
   var o = new core.List<api.ProfileFilterLink>();
   o.add(buildProfileFilterLink());
   o.add(buildProfileFilterLink());
   return o;
 }
 
-checkUnnamed46(core.List<api.ProfileFilterLink> o) {
+checkUnnamed633(core.List<api.ProfileFilterLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileFilterLink(o[0]);
   checkProfileFilterLink(o[1]);
@@ -2540,7 +2542,7 @@
   var o = new api.ProfileFilterLinks();
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    o.items = buildUnnamed46();
+    o.items = buildUnnamed633();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2556,7 +2558,7 @@
 checkProfileFilterLinks(api.ProfileFilterLinks o) {
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    checkUnnamed46(o.items);
+    checkUnnamed633(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2624,14 +2626,14 @@
   buildCounterProfileSummary--;
 }
 
-buildUnnamed47() {
+buildUnnamed634() {
   var o = new core.List<api.Profile>();
   o.add(buildProfile());
   o.add(buildProfile());
   return o;
 }
 
-checkUnnamed47(core.List<api.Profile> o) {
+checkUnnamed634(core.List<api.Profile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfile(o[0]);
   checkProfile(o[1]);
@@ -2642,7 +2644,7 @@
   var o = new api.Profiles();
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    o.items = buildUnnamed47();
+    o.items = buildUnnamed634();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2658,7 +2660,7 @@
 checkProfiles(api.Profiles o) {
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    checkUnnamed47(o.items);
+    checkUnnamed634(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2693,14 +2695,14 @@
   buildCounterRealtimeDataColumnHeaders--;
 }
 
-buildUnnamed48() {
+buildUnnamed635() {
   var o = new core.List<api.RealtimeDataColumnHeaders>();
   o.add(buildRealtimeDataColumnHeaders());
   o.add(buildRealtimeDataColumnHeaders());
   return o;
 }
 
-checkUnnamed48(core.List<api.RealtimeDataColumnHeaders> o) {
+checkUnnamed635(core.List<api.RealtimeDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRealtimeDataColumnHeaders(o[0]);
   checkRealtimeDataColumnHeaders(o[1]);
@@ -2735,27 +2737,27 @@
   buildCounterRealtimeDataProfileInfo--;
 }
 
-buildUnnamed49() {
+buildUnnamed636() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed49(core.List<core.String> o) {
+checkUnnamed636(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed50() {
+buildUnnamed637() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed50(core.List<core.String> o) {
+checkUnnamed637(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2770,8 +2772,8 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed49();
-    o.sort = buildUnnamed50();
+    o.metrics = buildUnnamed636();
+    o.sort = buildUnnamed637();
   }
   buildCounterRealtimeDataQuery--;
   return o;
@@ -2784,46 +2786,46 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed49(o.metrics);
-    checkUnnamed50(o.sort);
+    checkUnnamed636(o.metrics);
+    checkUnnamed637(o.sort);
   }
   buildCounterRealtimeDataQuery--;
 }
 
-buildUnnamed51() {
+buildUnnamed638() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed51(core.List<core.String> o) {
+checkUnnamed638(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed52() {
+buildUnnamed639() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed51());
-  o.add(buildUnnamed51());
+  o.add(buildUnnamed638());
+  o.add(buildUnnamed638());
   return o;
 }
 
-checkUnnamed52(core.List<core.List<core.String>> o) {
+checkUnnamed639(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed51(o[0]);
-  checkUnnamed51(o[1]);
+  checkUnnamed638(o[0]);
+  checkUnnamed638(o[1]);
 }
 
-buildUnnamed53() {
+buildUnnamed640() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed53(core.Map<core.String, core.String> o) {
+checkUnnamed640(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2834,15 +2836,15 @@
   var o = new api.RealtimeData();
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    o.columnHeaders = buildUnnamed48();
+    o.columnHeaders = buildUnnamed635();
     o.id = "foo";
     o.kind = "foo";
     o.profileInfo = buildRealtimeDataProfileInfo();
     o.query = buildRealtimeDataQuery();
-    o.rows = buildUnnamed52();
+    o.rows = buildUnnamed639();
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed53();
+    o.totalsForAllResults = buildUnnamed640();
   }
   buildCounterRealtimeData--;
   return o;
@@ -2851,15 +2853,15 @@
 checkRealtimeData(api.RealtimeData o) {
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    checkUnnamed48(o.columnHeaders);
+    checkUnnamed635(o.columnHeaders);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRealtimeDataProfileInfo(o.profileInfo);
     checkRealtimeDataQuery(o.query);
-    checkUnnamed52(o.rows);
+    checkUnnamed639(o.rows);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed53(o.totalsForAllResults);
+    checkUnnamed640(o.totalsForAllResults);
   }
   buildCounterRealtimeData--;
 }
@@ -2899,14 +2901,14 @@
   buildCounterSegment--;
 }
 
-buildUnnamed54() {
+buildUnnamed641() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed54(core.List<api.Segment> o) {
+checkUnnamed641(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -2917,7 +2919,7 @@
   var o = new api.Segments();
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    o.items = buildUnnamed54();
+    o.items = buildUnnamed641();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2933,7 +2935,7 @@
 checkSegments(api.Segments o) {
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    checkUnnamed54(o.items);
+    checkUnnamed641(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3040,14 +3042,14 @@
   buildCounterUnsampledReport--;
 }
 
-buildUnnamed55() {
+buildUnnamed642() {
   var o = new core.List<api.UnsampledReport>();
   o.add(buildUnsampledReport());
   o.add(buildUnsampledReport());
   return o;
 }
 
-checkUnnamed55(core.List<api.UnsampledReport> o) {
+checkUnnamed642(core.List<api.UnsampledReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUnsampledReport(o[0]);
   checkUnsampledReport(o[1]);
@@ -3058,7 +3060,7 @@
   var o = new api.UnsampledReports();
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    o.items = buildUnnamed55();
+    o.items = buildUnnamed642();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3074,7 +3076,7 @@
 checkUnsampledReports(api.UnsampledReports o) {
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    checkUnnamed55(o.items);
+    checkUnnamed642(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3086,14 +3088,14 @@
   buildCounterUnsampledReports--;
 }
 
-buildUnnamed56() {
+buildUnnamed643() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed56(core.List<core.String> o) {
+checkUnnamed643(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3106,7 +3108,7 @@
   if (buildCounterUpload < 3) {
     o.accountId = "foo";
     o.customDataSourceId = "foo";
-    o.errors = buildUnnamed56();
+    o.errors = buildUnnamed643();
     o.id = "foo";
     o.kind = "foo";
     o.status = "foo";
@@ -3120,7 +3122,7 @@
   if (buildCounterUpload < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.customDataSourceId, unittest.equals('foo'));
-    checkUnnamed56(o.errors);
+    checkUnnamed643(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -3128,14 +3130,14 @@
   buildCounterUpload--;
 }
 
-buildUnnamed57() {
+buildUnnamed644() {
   var o = new core.List<api.Upload>();
   o.add(buildUpload());
   o.add(buildUpload());
   return o;
 }
 
-checkUnnamed57(core.List<api.Upload> o) {
+checkUnnamed644(core.List<api.Upload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpload(o[0]);
   checkUpload(o[1]);
@@ -3146,7 +3148,7 @@
   var o = new api.Uploads();
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    o.items = buildUnnamed57();
+    o.items = buildUnnamed644();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3161,7 +3163,7 @@
 checkUploads(api.Uploads o) {
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    checkUnnamed57(o.items);
+    checkUnnamed644(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3224,14 +3226,14 @@
   buildCounterWebPropertyRef--;
 }
 
-buildUnnamed58() {
+buildUnnamed645() {
   var o = new core.List<api.ProfileSummary>();
   o.add(buildProfileSummary());
   o.add(buildProfileSummary());
   return o;
 }
 
-checkUnnamed58(core.List<api.ProfileSummary> o) {
+checkUnnamed645(core.List<api.ProfileSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileSummary(o[0]);
   checkProfileSummary(o[1]);
@@ -3247,7 +3249,7 @@
     o.kind = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.profiles = buildUnnamed58();
+    o.profiles = buildUnnamed645();
     o.websiteUrl = "foo";
   }
   buildCounterWebPropertySummary--;
@@ -3262,20 +3264,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed58(o.profiles);
+    checkUnnamed645(o.profiles);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterWebPropertySummary--;
 }
 
-buildUnnamed59() {
+buildUnnamed646() {
   var o = new core.List<api.Webproperty>();
   o.add(buildWebproperty());
   o.add(buildWebproperty());
   return o;
 }
 
-checkUnnamed59(core.List<api.Webproperty> o) {
+checkUnnamed646(core.List<api.Webproperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebproperty(o[0]);
   checkWebproperty(o[1]);
@@ -3286,7 +3288,7 @@
   var o = new api.Webproperties();
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    o.items = buildUnnamed59();
+    o.items = buildUnnamed646();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3302,7 +3304,7 @@
 checkWebproperties(api.Webproperties o) {
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    checkUnnamed59(o.items);
+    checkUnnamed646(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3356,14 +3358,14 @@
   buildCounterWebpropertyParentLink--;
 }
 
-buildUnnamed60() {
+buildUnnamed647() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed60(core.List<core.String> o) {
+checkUnnamed647(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3374,7 +3376,7 @@
   var o = new api.WebpropertyPermissions();
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    o.effective = buildUnnamed60();
+    o.effective = buildUnnamed647();
   }
   buildCounterWebpropertyPermissions--;
   return o;
@@ -3383,7 +3385,7 @@
 checkWebpropertyPermissions(api.WebpropertyPermissions o) {
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    checkUnnamed60(o.effective);
+    checkUnnamed647(o.effective);
   }
   buildCounterWebpropertyPermissions--;
 }
diff --git a/generated/googleapis/test/androidpublisher/v2_test.dart b/generated/googleapis/test/androidpublisher/v2_test.dart
index e5d6623..d7f63aa 100644
--- a/generated/googleapis/test/androidpublisher/v2_test.dart
+++ b/generated/googleapis/test/androidpublisher/v2_test.dart
@@ -77,14 +77,14 @@
   buildCounterApkListing--;
 }
 
-buildUnnamed61() {
+buildUnnamed1029() {
   var o = new core.List<api.ApkListing>();
   o.add(buildApkListing());
   o.add(buildApkListing());
   return o;
 }
 
-checkUnnamed61(core.List<api.ApkListing> o) {
+checkUnnamed1029(core.List<api.ApkListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApkListing(o[0]);
   checkApkListing(o[1]);
@@ -96,7 +96,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed61();
+    o.listings = buildUnnamed1029();
   }
   buildCounterApkListingsListResponse--;
   return o;
@@ -106,19 +106,19 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed61(o.listings);
+    checkUnnamed1029(o.listings);
   }
   buildCounterApkListingsListResponse--;
 }
 
-buildUnnamed62() {
+buildUnnamed1030() {
   var o = new core.List<api.Apk>();
   o.add(buildApk());
   o.add(buildApk());
   return o;
 }
 
-checkUnnamed62(core.List<api.Apk> o) {
+checkUnnamed1030(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApk(o[0]);
   checkApk(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ApksListResponse();
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    o.apks = buildUnnamed62();
+    o.apks = buildUnnamed1030();
     o.kind = "foo";
   }
   buildCounterApksListResponse--;
@@ -139,7 +139,7 @@
 checkApksListResponse(api.ApksListResponse o) {
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    checkUnnamed62(o.apks);
+    checkUnnamed1030(o.apks);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterApksListResponse--;
@@ -254,14 +254,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed63() {
+buildUnnamed1031() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed63(core.List<api.Image> o) {
+checkUnnamed1031(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -272,7 +272,7 @@
   var o = new api.ImagesDeleteAllResponse();
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    o.deleted = buildUnnamed63();
+    o.deleted = buildUnnamed1031();
   }
   buildCounterImagesDeleteAllResponse--;
   return o;
@@ -281,19 +281,19 @@
 checkImagesDeleteAllResponse(api.ImagesDeleteAllResponse o) {
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    checkUnnamed63(o.deleted);
+    checkUnnamed1031(o.deleted);
   }
   buildCounterImagesDeleteAllResponse--;
 }
 
-buildUnnamed64() {
+buildUnnamed1032() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed64(core.List<api.Image> o) {
+checkUnnamed1032(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -304,7 +304,7 @@
   var o = new api.ImagesListResponse();
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    o.images = buildUnnamed64();
+    o.images = buildUnnamed1032();
   }
   buildCounterImagesListResponse--;
   return o;
@@ -313,7 +313,7 @@
 checkImagesListResponse(api.ImagesListResponse o) {
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    checkUnnamed64(o.images);
+    checkUnnamed1032(o.images);
   }
   buildCounterImagesListResponse--;
 }
@@ -337,27 +337,27 @@
   buildCounterImagesUploadResponse--;
 }
 
-buildUnnamed65() {
+buildUnnamed1033() {
   var o = new core.Map<core.String, api.InAppProductListing>();
   o["x"] = buildInAppProductListing();
   o["y"] = buildInAppProductListing();
   return o;
 }
 
-checkUnnamed65(core.Map<core.String, api.InAppProductListing> o) {
+checkUnnamed1033(core.Map<core.String, api.InAppProductListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProductListing(o["x"]);
   checkInAppProductListing(o["y"]);
 }
 
-buildUnnamed66() {
+buildUnnamed1034() {
   var o = new core.Map<core.String, api.Price>();
   o["x"] = buildPrice();
   o["y"] = buildPrice();
   return o;
 }
 
-checkUnnamed66(core.Map<core.String, api.Price> o) {
+checkUnnamed1034(core.Map<core.String, api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrice(o["x"]);
   checkPrice(o["y"]);
@@ -370,9 +370,9 @@
   if (buildCounterInAppProduct < 3) {
     o.defaultLanguage = "foo";
     o.defaultPrice = buildPrice();
-    o.listings = buildUnnamed65();
+    o.listings = buildUnnamed1033();
     o.packageName = "foo";
-    o.prices = buildUnnamed66();
+    o.prices = buildUnnamed1034();
     o.purchaseType = "foo";
     o.season = buildSeason();
     o.sku = "foo";
@@ -389,9 +389,9 @@
   if (buildCounterInAppProduct < 3) {
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     checkPrice(o.defaultPrice);
-    checkUnnamed65(o.listings);
+    checkUnnamed1033(o.listings);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed66(o.prices);
+    checkUnnamed1034(o.prices);
     unittest.expect(o.purchaseType, unittest.equals('foo'));
     checkSeason(o.season);
     unittest.expect(o.sku, unittest.equals('foo'));
@@ -423,14 +423,14 @@
   buildCounterInAppProductListing--;
 }
 
-buildUnnamed67() {
+buildUnnamed1035() {
   var o = new core.List<api.InappproductsBatchRequestEntry>();
   o.add(buildInappproductsBatchRequestEntry());
   o.add(buildInappproductsBatchRequestEntry());
   return o;
 }
 
-checkUnnamed67(core.List<api.InappproductsBatchRequestEntry> o) {
+checkUnnamed1035(core.List<api.InappproductsBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchRequestEntry(o[0]);
   checkInappproductsBatchRequestEntry(o[1]);
@@ -441,7 +441,7 @@
   var o = new api.InappproductsBatchRequest();
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    o.entrys = buildUnnamed67();
+    o.entrys = buildUnnamed1035();
   }
   buildCounterInappproductsBatchRequest--;
   return o;
@@ -450,7 +450,7 @@
 checkInappproductsBatchRequest(api.InappproductsBatchRequest o) {
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    checkUnnamed67(o.entrys);
+    checkUnnamed1035(o.entrys);
   }
   buildCounterInappproductsBatchRequest--;
 }
@@ -480,14 +480,14 @@
   buildCounterInappproductsBatchRequestEntry--;
 }
 
-buildUnnamed68() {
+buildUnnamed1036() {
   var o = new core.List<api.InappproductsBatchResponseEntry>();
   o.add(buildInappproductsBatchResponseEntry());
   o.add(buildInappproductsBatchResponseEntry());
   return o;
 }
 
-checkUnnamed68(core.List<api.InappproductsBatchResponseEntry> o) {
+checkUnnamed1036(core.List<api.InappproductsBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchResponseEntry(o[0]);
   checkInappproductsBatchResponseEntry(o[1]);
@@ -498,7 +498,7 @@
   var o = new api.InappproductsBatchResponse();
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    o.entrys = buildUnnamed68();
+    o.entrys = buildUnnamed1036();
     o.kind = "foo";
   }
   buildCounterInappproductsBatchResponse--;
@@ -508,7 +508,7 @@
 checkInappproductsBatchResponse(api.InappproductsBatchResponse o) {
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    checkUnnamed68(o.entrys);
+    checkUnnamed1036(o.entrys);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInappproductsBatchResponse--;
@@ -575,14 +575,14 @@
   buildCounterInappproductsInsertResponse--;
 }
 
-buildUnnamed69() {
+buildUnnamed1037() {
   var o = new core.List<api.InAppProduct>();
   o.add(buildInAppProduct());
   o.add(buildInAppProduct());
   return o;
 }
 
-checkUnnamed69(core.List<api.InAppProduct> o) {
+checkUnnamed1037(core.List<api.InAppProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProduct(o[0]);
   checkInAppProduct(o[1]);
@@ -593,7 +593,7 @@
   var o = new api.InappproductsListResponse();
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    o.inappproduct = buildUnnamed69();
+    o.inappproduct = buildUnnamed1037();
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
@@ -605,7 +605,7 @@
 checkInappproductsListResponse(api.InappproductsListResponse o) {
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    checkUnnamed69(o.inappproduct);
+    checkUnnamed1037(o.inappproduct);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
@@ -678,14 +678,14 @@
   buildCounterListing--;
 }
 
-buildUnnamed70() {
+buildUnnamed1038() {
   var o = new core.List<api.Listing>();
   o.add(buildListing());
   o.add(buildListing());
   return o;
 }
 
-checkUnnamed70(core.List<api.Listing> o) {
+checkUnnamed1038(core.List<api.Listing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListing(o[0]);
   checkListing(o[1]);
@@ -697,7 +697,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed70();
+    o.listings = buildUnnamed1038();
   }
   buildCounterListingsListResponse--;
   return o;
@@ -707,7 +707,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed70(o.listings);
+    checkUnnamed1038(o.listings);
   }
   buildCounterListingsListResponse--;
 }
@@ -909,27 +909,27 @@
   buildCounterSubscriptionPurchasesDeferResponse--;
 }
 
-buildUnnamed71() {
+buildUnnamed1039() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed71(core.List<core.String> o) {
+checkUnnamed1039(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed72() {
+buildUnnamed1040() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed72(core.List<core.String> o) {
+checkUnnamed1040(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -940,8 +940,8 @@
   var o = new api.Testers();
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    o.googleGroups = buildUnnamed71();
-    o.googlePlusCommunities = buildUnnamed72();
+    o.googleGroups = buildUnnamed1039();
+    o.googlePlusCommunities = buildUnnamed1040();
   }
   buildCounterTesters--;
   return o;
@@ -950,8 +950,8 @@
 checkTesters(api.Testers o) {
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    checkUnnamed71(o.googleGroups);
-    checkUnnamed72(o.googlePlusCommunities);
+    checkUnnamed1039(o.googleGroups);
+    checkUnnamed1040(o.googlePlusCommunities);
   }
   buildCounterTesters--;
 }
@@ -977,14 +977,14 @@
   buildCounterTokenPagination--;
 }
 
-buildUnnamed73() {
+buildUnnamed1041() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed73(core.List<core.int> o) {
+checkUnnamed1041(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -997,7 +997,7 @@
   if (buildCounterTrack < 3) {
     o.track = "foo";
     o.userFraction = 42.0;
-    o.versionCodes = buildUnnamed73();
+    o.versionCodes = buildUnnamed1041();
   }
   buildCounterTrack--;
   return o;
@@ -1008,19 +1008,19 @@
   if (buildCounterTrack < 3) {
     unittest.expect(o.track, unittest.equals('foo'));
     unittest.expect(o.userFraction, unittest.equals(42.0));
-    checkUnnamed73(o.versionCodes);
+    checkUnnamed1041(o.versionCodes);
   }
   buildCounterTrack--;
 }
 
-buildUnnamed74() {
+buildUnnamed1042() {
   var o = new core.List<api.Track>();
   o.add(buildTrack());
   o.add(buildTrack());
   return o;
 }
 
-checkUnnamed74(core.List<api.Track> o) {
+checkUnnamed1042(core.List<api.Track> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrack(o[0]);
   checkTrack(o[1]);
@@ -1032,7 +1032,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     o.kind = "foo";
-    o.tracks = buildUnnamed74();
+    o.tracks = buildUnnamed1042();
   }
   buildCounterTracksListResponse--;
   return o;
@@ -1042,7 +1042,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed74(o.tracks);
+    checkUnnamed1042(o.tracks);
   }
   buildCounterTracksListResponse--;
 }
diff --git a/generated/googleapis/test/appsactivity/v1_test.dart b/generated/googleapis/test/appsactivity/v1_test.dart
index 41005f1..548d3c5 100644
--- a/generated/googleapis/test/appsactivity/v1_test.dart
+++ b/generated/googleapis/test/appsactivity/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed541() {
+buildUnnamed667() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed541(core.List<api.Event> o) {
+checkUnnamed667(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     o.combinedEvent = buildEvent();
-    o.singleEvents = buildUnnamed541();
+    o.singleEvents = buildUnnamed667();
   }
   buildCounterActivity--;
   return o;
@@ -45,32 +45,32 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     checkEvent(o.combinedEvent);
-    checkUnnamed541(o.singleEvents);
+    checkUnnamed667(o.singleEvents);
   }
   buildCounterActivity--;
 }
 
-buildUnnamed542() {
+buildUnnamed668() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed542(core.List<core.String> o) {
+checkUnnamed668(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed543() {
+buildUnnamed669() {
   var o = new core.List<api.PermissionChange>();
   o.add(buildPermissionChange());
   o.add(buildPermissionChange());
   return o;
 }
 
-checkUnnamed543(core.List<api.PermissionChange> o) {
+checkUnnamed669(core.List<api.PermissionChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionChange(o[0]);
   checkPermissionChange(o[1]);
@@ -81,11 +81,11 @@
   var o = new api.Event();
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    o.additionalEventTypes = buildUnnamed542();
+    o.additionalEventTypes = buildUnnamed668();
     o.eventTimeMillis = "foo";
     o.fromUserDeletion = true;
     o.move = buildMove();
-    o.permissionChanges = buildUnnamed543();
+    o.permissionChanges = buildUnnamed669();
     o.primaryEventType = "foo";
     o.rename = buildRename();
     o.target = buildTarget();
@@ -98,11 +98,11 @@
 checkEvent(api.Event o) {
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    checkUnnamed542(o.additionalEventTypes);
+    checkUnnamed668(o.additionalEventTypes);
     unittest.expect(o.eventTimeMillis, unittest.equals('foo'));
     unittest.expect(o.fromUserDeletion, unittest.isTrue);
     checkMove(o.move);
-    checkUnnamed543(o.permissionChanges);
+    checkUnnamed669(o.permissionChanges);
     unittest.expect(o.primaryEventType, unittest.equals('foo'));
     checkRename(o.rename);
     checkTarget(o.target);
@@ -111,14 +111,14 @@
   buildCounterEvent--;
 }
 
-buildUnnamed544() {
+buildUnnamed670() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed544(core.List<api.Activity> o) {
+checkUnnamed670(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ListActivitiesResponse();
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    o.activities = buildUnnamed544();
+    o.activities = buildUnnamed670();
     o.nextPageToken = "foo";
   }
   buildCounterListActivitiesResponse--;
@@ -139,33 +139,33 @@
 checkListActivitiesResponse(api.ListActivitiesResponse o) {
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    checkUnnamed544(o.activities);
+    checkUnnamed670(o.activities);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListActivitiesResponse--;
 }
 
-buildUnnamed545() {
+buildUnnamed671() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed545(core.List<api.Parent> o) {
+checkUnnamed671(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
 }
 
-buildUnnamed546() {
+buildUnnamed672() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed546(core.List<api.Parent> o) {
+checkUnnamed672(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -176,8 +176,8 @@
   var o = new api.Move();
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    o.addedParents = buildUnnamed545();
-    o.removedParents = buildUnnamed546();
+    o.addedParents = buildUnnamed671();
+    o.removedParents = buildUnnamed672();
   }
   buildCounterMove--;
   return o;
@@ -186,8 +186,8 @@
 checkMove(api.Move o) {
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    checkUnnamed545(o.addedParents);
-    checkUnnamed546(o.removedParents);
+    checkUnnamed671(o.addedParents);
+    checkUnnamed672(o.removedParents);
   }
   buildCounterMove--;
 }
@@ -244,27 +244,27 @@
   buildCounterPermission--;
 }
 
-buildUnnamed547() {
+buildUnnamed673() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed547(core.List<api.Permission> o) {
+checkUnnamed673(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed548() {
+buildUnnamed674() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed548(core.List<api.Permission> o) {
+checkUnnamed674(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -275,8 +275,8 @@
   var o = new api.PermissionChange();
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    o.addedPermissions = buildUnnamed547();
-    o.removedPermissions = buildUnnamed548();
+    o.addedPermissions = buildUnnamed673();
+    o.removedPermissions = buildUnnamed674();
   }
   buildCounterPermissionChange--;
   return o;
@@ -285,8 +285,8 @@
 checkPermissionChange(api.PermissionChange o) {
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    checkUnnamed547(o.addedPermissions);
-    checkUnnamed548(o.removedPermissions);
+    checkUnnamed673(o.addedPermissions);
+    checkUnnamed674(o.removedPermissions);
   }
   buildCounterPermissionChange--;
 }
diff --git a/generated/googleapis/test/appstate/v1_test.dart b/generated/googleapis/test/appstate/v1_test.dart
index 6254f0a..4cb6822 100644
--- a/generated/googleapis/test/appstate/v1_test.dart
+++ b/generated/googleapis/test/appstate/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterGetResponse--;
 }
 
-buildUnnamed736() {
+buildUnnamed1019() {
   var o = new core.List<api.GetResponse>();
   o.add(buildGetResponse());
   o.add(buildGetResponse());
   return o;
 }
 
-checkUnnamed736(core.List<api.GetResponse> o) {
+checkUnnamed1019(core.List<api.GetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGetResponse(o[0]);
   checkGetResponse(o[1]);
@@ -59,7 +59,7 @@
   var o = new api.ListResponse();
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    o.items = buildUnnamed736();
+    o.items = buildUnnamed1019();
     o.kind = "foo";
     o.maximumKeyCount = 42;
   }
@@ -70,7 +70,7 @@
 checkListResponse(api.ListResponse o) {
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    checkUnnamed736(o.items);
+    checkUnnamed1019(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maximumKeyCount, unittest.equals(42));
   }
diff --git a/generated/googleapis/test/bigquery/v2_test.dart b/generated/googleapis/test/bigquery/v2_test.dart
index 74f3e6f..331cea0 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -45,14 +45,14 @@
   buildCounterDatasetAccess--;
 }
 
-buildUnnamed716() {
+buildUnnamed1089() {
   var o = new core.List<api.DatasetAccess>();
   o.add(buildDatasetAccess());
   o.add(buildDatasetAccess());
   return o;
 }
 
-checkUnnamed716(core.List<api.DatasetAccess> o) {
+checkUnnamed1089(core.List<api.DatasetAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetAccess(o[0]);
   checkDatasetAccess(o[1]);
@@ -63,7 +63,7 @@
   var o = new api.Dataset();
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    o.access = buildUnnamed716();
+    o.access = buildUnnamed1089();
     o.creationTime = "foo";
     o.datasetReference = buildDatasetReference();
     o.description = "foo";
@@ -81,7 +81,7 @@
 checkDataset(api.Dataset o) {
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    checkUnnamed716(o.access);
+    checkUnnamed1089(o.access);
     unittest.expect(o.creationTime, unittest.equals('foo'));
     checkDatasetReference(o.datasetReference);
     unittest.expect(o.description, unittest.equals('foo'));
@@ -120,14 +120,14 @@
   buildCounterDatasetListDatasets--;
 }
 
-buildUnnamed717() {
+buildUnnamed1090() {
   var o = new core.List<api.DatasetListDatasets>();
   o.add(buildDatasetListDatasets());
   o.add(buildDatasetListDatasets());
   return o;
 }
 
-checkUnnamed717(core.List<api.DatasetListDatasets> o) {
+checkUnnamed1090(core.List<api.DatasetListDatasets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetListDatasets(o[0]);
   checkDatasetListDatasets(o[1]);
@@ -138,7 +138,7 @@
   var o = new api.DatasetList();
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    o.datasets = buildUnnamed717();
+    o.datasets = buildUnnamed1090();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -150,7 +150,7 @@
 checkDatasetList(api.DatasetList o) {
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    checkUnnamed717(o.datasets);
+    checkUnnamed1090(o.datasets);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -204,14 +204,14 @@
   buildCounterErrorProto--;
 }
 
-buildUnnamed718() {
+buildUnnamed1091() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed718(core.List<api.TableRow> o) {
+checkUnnamed1091(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -228,7 +228,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed718();
+    o.rows = buildUnnamed1091();
     o.schema = buildTableSchema();
     o.totalRows = "foo";
   }
@@ -245,7 +245,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed718(o.rows);
+    checkUnnamed1091(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
@@ -314,14 +314,14 @@
   buildCounterJobConfiguration--;
 }
 
-buildUnnamed719() {
+buildUnnamed1092() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed719(core.List<core.String> o) {
+checkUnnamed1092(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -335,7 +335,7 @@
     o.compression = "foo";
     o.destinationFormat = "foo";
     o.destinationUri = "foo";
-    o.destinationUris = buildUnnamed719();
+    o.destinationUris = buildUnnamed1092();
     o.fieldDelimiter = "foo";
     o.printHeader = true;
     o.sourceTable = buildTableReference();
@@ -350,7 +350,7 @@
     unittest.expect(o.compression, unittest.equals('foo'));
     unittest.expect(o.destinationFormat, unittest.equals('foo'));
     unittest.expect(o.destinationUri, unittest.equals('foo'));
-    checkUnnamed719(o.destinationUris);
+    checkUnnamed1092(o.destinationUris);
     unittest.expect(o.fieldDelimiter, unittest.equals('foo'));
     unittest.expect(o.printHeader, unittest.isTrue);
     checkTableReference(o.sourceTable);
@@ -358,14 +358,14 @@
   buildCounterJobConfigurationExtract--;
 }
 
-buildUnnamed720() {
+buildUnnamed1093() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed720(core.List<core.String> o) {
+checkUnnamed1093(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -378,7 +378,7 @@
   if (buildCounterJobConfigurationLink < 3) {
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
-    o.sourceUri = buildUnnamed720();
+    o.sourceUri = buildUnnamed1093();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLink--;
@@ -390,20 +390,20 @@
   if (buildCounterJobConfigurationLink < 3) {
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
-    checkUnnamed720(o.sourceUri);
+    checkUnnamed1093(o.sourceUri);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLink--;
 }
 
-buildUnnamed721() {
+buildUnnamed1094() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed721(core.List<core.String> o) {
+checkUnnamed1094(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -428,7 +428,7 @@
     o.schemaInlineFormat = "foo";
     o.skipLeadingRows = 42;
     o.sourceFormat = "foo";
-    o.sourceUris = buildUnnamed721();
+    o.sourceUris = buildUnnamed1094();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLoad--;
@@ -452,7 +452,7 @@
     unittest.expect(o.schemaInlineFormat, unittest.equals('foo'));
     unittest.expect(o.skipLeadingRows, unittest.equals(42));
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
-    checkUnnamed721(o.sourceUris);
+    checkUnnamed1094(o.sourceUris);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLoad--;
@@ -495,14 +495,14 @@
   buildCounterJobConfigurationQuery--;
 }
 
-buildUnnamed722() {
+buildUnnamed1095() {
   var o = new core.List<api.TableReference>();
   o.add(buildTableReference());
   o.add(buildTableReference());
   return o;
 }
 
-checkUnnamed722(core.List<api.TableReference> o) {
+checkUnnamed1095(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableReference(o[0]);
   checkTableReference(o[1]);
@@ -516,7 +516,7 @@
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
     o.sourceTable = buildTableReference();
-    o.sourceTables = buildUnnamed722();
+    o.sourceTables = buildUnnamed1095();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationTableCopy--;
@@ -529,7 +529,7 @@
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
     checkTableReference(o.sourceTable);
-    checkUnnamed722(o.sourceTables);
+    checkUnnamed1095(o.sourceTables);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationTableCopy--;
@@ -570,14 +570,14 @@
   buildCounterJobListJobs--;
 }
 
-buildUnnamed723() {
+buildUnnamed1096() {
   var o = new core.List<api.JobListJobs>();
   o.add(buildJobListJobs());
   o.add(buildJobListJobs());
   return o;
 }
 
-checkUnnamed723(core.List<api.JobListJobs> o) {
+checkUnnamed1096(core.List<api.JobListJobs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobListJobs(o[0]);
   checkJobListJobs(o[1]);
@@ -589,7 +589,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     o.etag = "foo";
-    o.jobs = buildUnnamed723();
+    o.jobs = buildUnnamed1096();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -602,7 +602,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed723(o.jobs);
+    checkUnnamed1096(o.jobs);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -706,14 +706,14 @@
   buildCounterJobStatistics3--;
 }
 
-buildUnnamed724() {
+buildUnnamed1097() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed724(core.List<api.ErrorProto> o) {
+checkUnnamed1097(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -725,7 +725,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     o.errorResult = buildErrorProto();
-    o.errors = buildUnnamed724();
+    o.errors = buildUnnamed1097();
     o.state = "foo";
   }
   buildCounterJobStatus--;
@@ -736,7 +736,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     checkErrorProto(o.errorResult);
-    checkUnnamed724(o.errors);
+    checkUnnamed1097(o.errors);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterJobStatus--;
@@ -782,14 +782,14 @@
   buildCounterProjectListProjects--;
 }
 
-buildUnnamed725() {
+buildUnnamed1098() {
   var o = new core.List<api.ProjectListProjects>();
   o.add(buildProjectListProjects());
   o.add(buildProjectListProjects());
   return o;
 }
 
-checkUnnamed725(core.List<api.ProjectListProjects> o) {
+checkUnnamed1098(core.List<api.ProjectListProjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjectListProjects(o[0]);
   checkProjectListProjects(o[1]);
@@ -803,7 +803,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed725();
+    o.projects = buildUnnamed1098();
     o.totalItems = 42;
   }
   buildCounterProjectList--;
@@ -816,7 +816,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed725(o.projects);
+    checkUnnamed1098(o.projects);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterProjectList--;
@@ -874,14 +874,14 @@
   buildCounterQueryRequest--;
 }
 
-buildUnnamed726() {
+buildUnnamed1099() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed726(core.List<api.TableRow> o) {
+checkUnnamed1099(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -897,7 +897,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed726();
+    o.rows = buildUnnamed1099();
     o.schema = buildTableSchema();
     o.totalBytesProcessed = "foo";
     o.totalRows = "foo";
@@ -914,7 +914,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed726(o.rows);
+    checkUnnamed1099(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
@@ -1009,14 +1009,14 @@
   buildCounterTableDataInsertAllRequestRows--;
 }
 
-buildUnnamed727() {
+buildUnnamed1100() {
   var o = new core.List<api.TableDataInsertAllRequestRows>();
   o.add(buildTableDataInsertAllRequestRows());
   o.add(buildTableDataInsertAllRequestRows());
   return o;
 }
 
-checkUnnamed727(core.List<api.TableDataInsertAllRequestRows> o) {
+checkUnnamed1100(core.List<api.TableDataInsertAllRequestRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllRequestRows(o[0]);
   checkTableDataInsertAllRequestRows(o[1]);
@@ -1028,7 +1028,7 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     o.kind = "foo";
-    o.rows = buildUnnamed727();
+    o.rows = buildUnnamed1100();
   }
   buildCounterTableDataInsertAllRequest--;
   return o;
@@ -1038,19 +1038,19 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed727(o.rows);
+    checkUnnamed1100(o.rows);
   }
   buildCounterTableDataInsertAllRequest--;
 }
 
-buildUnnamed728() {
+buildUnnamed1101() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed728(core.List<api.ErrorProto> o) {
+checkUnnamed1101(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -1061,7 +1061,7 @@
   var o = new api.TableDataInsertAllResponseInsertErrors();
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    o.errors = buildUnnamed728();
+    o.errors = buildUnnamed1101();
     o.index = 42;
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
@@ -1071,20 +1071,20 @@
 checkTableDataInsertAllResponseInsertErrors(api.TableDataInsertAllResponseInsertErrors o) {
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    checkUnnamed728(o.errors);
+    checkUnnamed1101(o.errors);
     unittest.expect(o.index, unittest.equals(42));
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
 }
 
-buildUnnamed729() {
+buildUnnamed1102() {
   var o = new core.List<api.TableDataInsertAllResponseInsertErrors>();
   o.add(buildTableDataInsertAllResponseInsertErrors());
   o.add(buildTableDataInsertAllResponseInsertErrors());
   return o;
 }
 
-checkUnnamed729(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
+checkUnnamed1102(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllResponseInsertErrors(o[0]);
   checkTableDataInsertAllResponseInsertErrors(o[1]);
@@ -1095,7 +1095,7 @@
   var o = new api.TableDataInsertAllResponse();
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    o.insertErrors = buildUnnamed729();
+    o.insertErrors = buildUnnamed1102();
     o.kind = "foo";
   }
   buildCounterTableDataInsertAllResponse--;
@@ -1105,20 +1105,20 @@
 checkTableDataInsertAllResponse(api.TableDataInsertAllResponse o) {
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    checkUnnamed729(o.insertErrors);
+    checkUnnamed1102(o.insertErrors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTableDataInsertAllResponse--;
 }
 
-buildUnnamed730() {
+buildUnnamed1103() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed730(core.List<api.TableRow> o) {
+checkUnnamed1103(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -1132,7 +1132,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed730();
+    o.rows = buildUnnamed1103();
     o.totalRows = "foo";
   }
   buildCounterTableDataList--;
@@ -1145,20 +1145,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed730(o.rows);
+    checkUnnamed1103(o.rows);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
   buildCounterTableDataList--;
 }
 
-buildUnnamed731() {
+buildUnnamed1104() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed731(core.List<api.TableFieldSchema> o) {
+checkUnnamed1104(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1170,7 +1170,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     o.description = "foo";
-    o.fields = buildUnnamed731();
+    o.fields = buildUnnamed1104();
     o.mode = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -1183,7 +1183,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed731(o.fields);
+    checkUnnamed1104(o.fields);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1218,14 +1218,14 @@
   buildCounterTableListTables--;
 }
 
-buildUnnamed732() {
+buildUnnamed1105() {
   var o = new core.List<api.TableListTables>();
   o.add(buildTableListTables());
   o.add(buildTableListTables());
   return o;
 }
 
-checkUnnamed732(core.List<api.TableListTables> o) {
+checkUnnamed1105(core.List<api.TableListTables> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableListTables(o[0]);
   checkTableListTables(o[1]);
@@ -1239,7 +1239,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed732();
+    o.tables = buildUnnamed1105();
     o.totalItems = 42;
   }
   buildCounterTableList--;
@@ -1252,7 +1252,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed732(o.tables);
+    checkUnnamed1105(o.tables);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterTableList--;
@@ -1281,14 +1281,14 @@
   buildCounterTableReference--;
 }
 
-buildUnnamed733() {
+buildUnnamed1106() {
   var o = new core.List<api.TableCell>();
   o.add(buildTableCell());
   o.add(buildTableCell());
   return o;
 }
 
-checkUnnamed733(core.List<api.TableCell> o) {
+checkUnnamed1106(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableCell(o[0]);
   checkTableCell(o[1]);
@@ -1299,7 +1299,7 @@
   var o = new api.TableRow();
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    o.f = buildUnnamed733();
+    o.f = buildUnnamed1106();
   }
   buildCounterTableRow--;
   return o;
@@ -1308,19 +1308,19 @@
 checkTableRow(api.TableRow o) {
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    checkUnnamed733(o.f);
+    checkUnnamed1106(o.f);
   }
   buildCounterTableRow--;
 }
 
-buildUnnamed734() {
+buildUnnamed1107() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed734(core.List<api.TableFieldSchema> o) {
+checkUnnamed1107(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1331,7 +1331,7 @@
   var o = new api.TableSchema();
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    o.fields = buildUnnamed734();
+    o.fields = buildUnnamed1107();
   }
   buildCounterTableSchema--;
   return o;
@@ -1340,7 +1340,7 @@
 checkTableSchema(api.TableSchema o) {
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    checkUnnamed734(o.fields);
+    checkUnnamed1107(o.fields);
   }
   buildCounterTableSchema--;
 }
@@ -1364,14 +1364,14 @@
   buildCounterViewDefinition--;
 }
 
-buildUnnamed735() {
+buildUnnamed1108() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed735(core.List<core.String> o) {
+checkUnnamed1108(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2295,7 +2295,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_projection = "foo";
-      var arg_stateFilter = buildUnnamed735();
+      var arg_stateFilter = buildUnnamed1108();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index 18a3491..b363cc6 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -60,14 +60,14 @@
   buildCounterBlogPages--;
 }
 
-buildUnnamed549() {
+buildUnnamed712() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed549(core.List<api.Post> o) {
+checkUnnamed712(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -78,7 +78,7 @@
   var o = new api.BlogPosts();
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    o.items = buildUnnamed549();
+    o.items = buildUnnamed712();
     o.selfLink = "foo";
     o.totalItems = 42;
   }
@@ -89,7 +89,7 @@
 checkBlogPosts(api.BlogPosts o) {
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    checkUnnamed549(o.items);
+    checkUnnamed712(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
@@ -139,27 +139,27 @@
   buildCounterBlog--;
 }
 
-buildUnnamed550() {
+buildUnnamed713() {
   var o = new core.List<api.BlogUserInfo>();
   o.add(buildBlogUserInfo());
   o.add(buildBlogUserInfo());
   return o;
 }
 
-checkUnnamed550(core.List<api.BlogUserInfo> o) {
+checkUnnamed713(core.List<api.BlogUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlogUserInfo(o[0]);
   checkBlogUserInfo(o[1]);
 }
 
-buildUnnamed551() {
+buildUnnamed714() {
   var o = new core.List<api.Blog>();
   o.add(buildBlog());
   o.add(buildBlog());
   return o;
 }
 
-checkUnnamed551(core.List<api.Blog> o) {
+checkUnnamed714(core.List<api.Blog> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlog(o[0]);
   checkBlog(o[1]);
@@ -170,8 +170,8 @@
   var o = new api.BlogList();
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    o.blogUserInfos = buildUnnamed550();
-    o.items = buildUnnamed551();
+    o.blogUserInfos = buildUnnamed713();
+    o.items = buildUnnamed714();
     o.kind = "foo";
   }
   buildCounterBlogList--;
@@ -181,8 +181,8 @@
 checkBlogList(api.BlogList o) {
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    checkUnnamed550(o.blogUserInfos);
-    checkUnnamed551(o.items);
+    checkUnnamed713(o.blogUserInfos);
+    checkUnnamed714(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBlogList--;
@@ -380,14 +380,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed552() {
+buildUnnamed715() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed552(core.List<api.Comment> o) {
+checkUnnamed715(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -398,7 +398,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed552();
+    o.items = buildUnnamed715();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.prevPageToken = "foo";
@@ -410,7 +410,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed552(o.items);
+    checkUnnamed715(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
@@ -522,14 +522,14 @@
   buildCounterPage--;
 }
 
-buildUnnamed553() {
+buildUnnamed716() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed553(core.List<api.Page> o) {
+checkUnnamed716(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -540,7 +540,7 @@
   var o = new api.PageList();
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    o.items = buildUnnamed553();
+    o.items = buildUnnamed716();
     o.kind = "foo";
   }
   buildCounterPageList--;
@@ -550,7 +550,7 @@
 checkPageList(api.PageList o) {
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    checkUnnamed553(o.items);
+    checkUnnamed716(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageList--;
@@ -577,14 +577,14 @@
   buildCounterPageviewsCounts--;
 }
 
-buildUnnamed554() {
+buildUnnamed717() {
   var o = new core.List<api.PageviewsCounts>();
   o.add(buildPageviewsCounts());
   o.add(buildPageviewsCounts());
   return o;
 }
 
-checkUnnamed554(core.List<api.PageviewsCounts> o) {
+checkUnnamed717(core.List<api.PageviewsCounts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageviewsCounts(o[0]);
   checkPageviewsCounts(o[1]);
@@ -596,7 +596,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     o.blogId = "foo";
-    o.counts = buildUnnamed554();
+    o.counts = buildUnnamed717();
     o.kind = "foo";
   }
   buildCounterPageviews--;
@@ -607,7 +607,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     unittest.expect(o.blogId, unittest.equals('foo'));
-    checkUnnamed554(o.counts);
+    checkUnnamed717(o.counts);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageviews--;
@@ -695,27 +695,27 @@
   buildCounterPostImages--;
 }
 
-buildUnnamed555() {
+buildUnnamed718() {
   var o = new core.List<api.PostImages>();
   o.add(buildPostImages());
   o.add(buildPostImages());
   return o;
 }
 
-checkUnnamed555(core.List<api.PostImages> o) {
+checkUnnamed718(core.List<api.PostImages> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostImages(o[0]);
   checkPostImages(o[1]);
 }
 
-buildUnnamed556() {
+buildUnnamed719() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed556(core.List<core.String> o) {
+checkUnnamed719(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -746,14 +746,14 @@
   buildCounterPostLocation--;
 }
 
-buildUnnamed557() {
+buildUnnamed720() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed557(core.List<api.Comment> o) {
+checkUnnamed720(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -764,7 +764,7 @@
   var o = new api.PostReplies();
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    o.items = buildUnnamed557();
+    o.items = buildUnnamed720();
     o.selfLink = "foo";
     o.totalItems = "foo";
   }
@@ -775,7 +775,7 @@
 checkPostReplies(api.PostReplies o) {
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    checkUnnamed557(o.items);
+    checkUnnamed720(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals('foo'));
   }
@@ -793,9 +793,9 @@
     o.customMetaData = "foo";
     o.etag = "foo";
     o.id = "foo";
-    o.images = buildUnnamed555();
+    o.images = buildUnnamed718();
     o.kind = "foo";
-    o.labels = buildUnnamed556();
+    o.labels = buildUnnamed719();
     o.location = buildPostLocation();
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.readerComments = "foo";
@@ -820,9 +820,9 @@
     unittest.expect(o.customMetaData, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed555(o.images);
+    checkUnnamed718(o.images);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed556(o.labels);
+    checkUnnamed719(o.labels);
     checkPostLocation(o.location);
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.readerComments, unittest.equals('foo'));
@@ -837,14 +837,14 @@
   buildCounterPost--;
 }
 
-buildUnnamed558() {
+buildUnnamed721() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed558(core.List<api.Post> o) {
+checkUnnamed721(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -855,7 +855,7 @@
   var o = new api.PostList();
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    o.items = buildUnnamed558();
+    o.items = buildUnnamed721();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -866,7 +866,7 @@
 checkPostList(api.PostList o) {
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    checkUnnamed558(o.items);
+    checkUnnamed721(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -923,14 +923,14 @@
   buildCounterPostUserInfo--;
 }
 
-buildUnnamed559() {
+buildUnnamed722() {
   var o = new core.List<api.PostUserInfo>();
   o.add(buildPostUserInfo());
   o.add(buildPostUserInfo());
   return o;
 }
 
-checkUnnamed559(core.List<api.PostUserInfo> o) {
+checkUnnamed722(core.List<api.PostUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostUserInfo(o[0]);
   checkPostUserInfo(o[1]);
@@ -941,7 +941,7 @@
   var o = new api.PostUserInfosList();
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    o.items = buildUnnamed559();
+    o.items = buildUnnamed722();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -952,7 +952,7 @@
 checkPostUserInfosList(api.PostUserInfosList o) {
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    checkUnnamed559(o.items);
+    checkUnnamed722(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1036,92 +1036,92 @@
   buildCounterUser--;
 }
 
-buildUnnamed560() {
+buildUnnamed723() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed560(core.List<core.String> o) {
+checkUnnamed723(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed561() {
+buildUnnamed724() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed561(core.List<core.String> o) {
+checkUnnamed724(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed562() {
+buildUnnamed725() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed562(core.List<core.String> o) {
+checkUnnamed725(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed563() {
+buildUnnamed726() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed563(core.List<core.String> o) {
+checkUnnamed726(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed564() {
+buildUnnamed727() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed564(core.List<core.String> o) {
+checkUnnamed727(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed565() {
+buildUnnamed728() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed565(core.List<core.String> o) {
+checkUnnamed728(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed566() {
+buildUnnamed729() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed566(core.List<core.String> o) {
+checkUnnamed729(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1616,8 +1616,8 @@
       api.BlogsResourceApi res = new api.BloggerApi(mock).blogs;
       var arg_userId = "foo";
       var arg_fetchUserInfo = true;
-      var arg_role = buildUnnamed560();
-      var arg_status = buildUnnamed561();
+      var arg_role = buildUnnamed723();
+      var arg_status = buildUnnamed724();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -1885,7 +1885,7 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed562();
+      var arg_status = buildUnnamed725();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2159,7 +2159,7 @@
       var mock = new common_test.HttpServerMock();
       api.PageViewsResourceApi res = new api.BloggerApi(mock).pageViews;
       var arg_blogId = "foo";
-      var arg_range = buildUnnamed563();
+      var arg_range = buildUnnamed726();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2392,7 +2392,7 @@
       api.PagesResourceApi res = new api.BloggerApi(mock).pages;
       var arg_blogId = "foo";
       var arg_fetchBodies = true;
-      var arg_status = buildUnnamed564();
+      var arg_status = buildUnnamed727();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -2781,7 +2781,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed565();
+      var arg_status = buildUnnamed728();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -3106,7 +3106,7 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed566();
+      var arg_status = buildUnnamed729();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index afd40f7..ffc0aca 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -93,14 +93,14 @@
   buildCounterAnnotationLayerSummary--;
 }
 
-buildUnnamed948() {
+buildUnnamed509() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed948(core.List<core.String> o) {
+checkUnnamed509(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -123,7 +123,7 @@
     o.kind = "foo";
     o.layerId = "foo";
     o.layerSummary = buildAnnotationLayerSummary();
-    o.pageIds = buildUnnamed948();
+    o.pageIds = buildUnnamed509();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -148,7 +148,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
     checkAnnotationLayerSummary(o.layerSummary);
-    checkUnnamed948(o.pageIds);
+    checkUnnamed509(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -192,14 +192,14 @@
   buildCounterAnnotationdata--;
 }
 
-buildUnnamed949() {
+buildUnnamed510() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed949(core.List<api.Annotation> o) {
+checkUnnamed510(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -210,7 +210,7 @@
   var o = new api.Annotations();
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    o.items = buildUnnamed949();
+    o.items = buildUnnamed510();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -222,7 +222,7 @@
 checkAnnotations(api.Annotations o) {
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    checkUnnamed949(o.items);
+    checkUnnamed510(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -257,14 +257,14 @@
   buildCounterAnnotationsSummaryLayers--;
 }
 
-buildUnnamed950() {
+buildUnnamed511() {
   var o = new core.List<api.AnnotationsSummaryLayers>();
   o.add(buildAnnotationsSummaryLayers());
   o.add(buildAnnotationsSummaryLayers());
   return o;
 }
 
-checkUnnamed950(core.List<api.AnnotationsSummaryLayers> o) {
+checkUnnamed511(core.List<api.AnnotationsSummaryLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationsSummaryLayers(o[0]);
   checkAnnotationsSummaryLayers(o[1]);
@@ -276,7 +276,7 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     o.kind = "foo";
-    o.layers = buildUnnamed950();
+    o.layers = buildUnnamed511();
   }
   buildCounterAnnotationsSummary--;
   return o;
@@ -286,19 +286,19 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed950(o.layers);
+    checkUnnamed511(o.layers);
   }
   buildCounterAnnotationsSummary--;
 }
 
-buildUnnamed951() {
+buildUnnamed512() {
   var o = new core.List<api.Annotationdata>();
   o.add(buildAnnotationdata());
   o.add(buildAnnotationdata());
   return o;
 }
 
-checkUnnamed951(core.List<api.Annotationdata> o) {
+checkUnnamed512(core.List<api.Annotationdata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationdata(o[0]);
   checkAnnotationdata(o[1]);
@@ -309,7 +309,7 @@
   var o = new api.Annotationsdata();
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    o.items = buildUnnamed951();
+    o.items = buildUnnamed512();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -321,7 +321,7 @@
 checkAnnotationsdata(api.Annotationsdata o) {
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    checkUnnamed951(o.items);
+    checkUnnamed512(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -435,14 +435,14 @@
   buildCounterBookshelf--;
 }
 
-buildUnnamed952() {
+buildUnnamed513() {
   var o = new core.List<api.Bookshelf>();
   o.add(buildBookshelf());
   o.add(buildBookshelf());
   return o;
 }
 
-checkUnnamed952(core.List<api.Bookshelf> o) {
+checkUnnamed513(core.List<api.Bookshelf> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBookshelf(o[0]);
   checkBookshelf(o[1]);
@@ -453,7 +453,7 @@
   var o = new api.Bookshelves();
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    o.items = buildUnnamed952();
+    o.items = buildUnnamed513();
     o.kind = "foo";
   }
   buildCounterBookshelves--;
@@ -463,7 +463,7 @@
 checkBookshelves(api.Bookshelves o) {
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    checkUnnamed952(o.items);
+    checkUnnamed513(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBookshelves--;
@@ -590,14 +590,14 @@
   buildCounterDictlayerdataDictWordsDerivatives--;
 }
 
-buildUnnamed953() {
+buildUnnamed514() {
   var o = new core.List<api.DictlayerdataDictWordsDerivatives>();
   o.add(buildDictlayerdataDictWordsDerivatives());
   o.add(buildDictlayerdataDictWordsDerivatives());
   return o;
 }
 
-checkUnnamed953(core.List<api.DictlayerdataDictWordsDerivatives> o) {
+checkUnnamed514(core.List<api.DictlayerdataDictWordsDerivatives> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsDerivatives(o[0]);
   checkDictlayerdataDictWordsDerivatives(o[1]);
@@ -645,14 +645,14 @@
   buildCounterDictlayerdataDictWordsExamples--;
 }
 
-buildUnnamed954() {
+buildUnnamed515() {
   var o = new core.List<api.DictlayerdataDictWordsExamples>();
   o.add(buildDictlayerdataDictWordsExamples());
   o.add(buildDictlayerdataDictWordsExamples());
   return o;
 }
 
-checkUnnamed954(core.List<api.DictlayerdataDictWordsExamples> o) {
+checkUnnamed515(core.List<api.DictlayerdataDictWordsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsExamples(o[0]);
   checkDictlayerdataDictWordsExamples(o[1]);
@@ -679,14 +679,14 @@
   buildCounterDictlayerdataDictWordsSensesConjugations--;
 }
 
-buildUnnamed955() {
+buildUnnamed516() {
   var o = new core.List<api.DictlayerdataDictWordsSensesConjugations>();
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   return o;
 }
 
-checkUnnamed955(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
+checkUnnamed516(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesConjugations(o[0]);
   checkDictlayerdataDictWordsSensesConjugations(o[1]);
@@ -734,14 +734,14 @@
   buildCounterDictlayerdataDictWordsSensesDefinitionsExamples--;
 }
 
-buildUnnamed956() {
+buildUnnamed517() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples>();
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   return o;
 }
 
-checkUnnamed956(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
+checkUnnamed517(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[0]);
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[1]);
@@ -753,7 +753,7 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     o.definition = "foo";
-    o.examples = buildUnnamed956();
+    o.examples = buildUnnamed517();
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
   return o;
@@ -763,19 +763,19 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     unittest.expect(o.definition, unittest.equals('foo'));
-    checkUnnamed956(o.examples);
+    checkUnnamed517(o.examples);
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
 }
 
-buildUnnamed957() {
+buildUnnamed518() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitions>();
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   return o;
 }
 
-checkUnnamed957(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
+checkUnnamed518(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitions(o[0]);
   checkDictlayerdataDictWordsSensesDefinitions(o[1]);
@@ -844,14 +844,14 @@
   buildCounterDictlayerdataDictWordsSensesSynonyms--;
 }
 
-buildUnnamed958() {
+buildUnnamed519() {
   var o = new core.List<api.DictlayerdataDictWordsSensesSynonyms>();
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   return o;
 }
 
-checkUnnamed958(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
+checkUnnamed519(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesSynonyms(o[0]);
   checkDictlayerdataDictWordsSensesSynonyms(o[1]);
@@ -862,14 +862,14 @@
   var o = new api.DictlayerdataDictWordsSenses();
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    o.conjugations = buildUnnamed955();
-    o.definitions = buildUnnamed957();
+    o.conjugations = buildUnnamed516();
+    o.definitions = buildUnnamed518();
     o.partOfSpeech = "foo";
     o.pronunciation = "foo";
     o.pronunciationUrl = "foo";
     o.source = buildDictlayerdataDictWordsSensesSource();
     o.syllabification = "foo";
-    o.synonyms = buildUnnamed958();
+    o.synonyms = buildUnnamed519();
   }
   buildCounterDictlayerdataDictWordsSenses--;
   return o;
@@ -878,26 +878,26 @@
 checkDictlayerdataDictWordsSenses(api.DictlayerdataDictWordsSenses o) {
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    checkUnnamed955(o.conjugations);
-    checkUnnamed957(o.definitions);
+    checkUnnamed516(o.conjugations);
+    checkUnnamed518(o.definitions);
     unittest.expect(o.partOfSpeech, unittest.equals('foo'));
     unittest.expect(o.pronunciation, unittest.equals('foo'));
     unittest.expect(o.pronunciationUrl, unittest.equals('foo'));
     checkDictlayerdataDictWordsSensesSource(o.source);
     unittest.expect(o.syllabification, unittest.equals('foo'));
-    checkUnnamed958(o.synonyms);
+    checkUnnamed519(o.synonyms);
   }
   buildCounterDictlayerdataDictWordsSenses--;
 }
 
-buildUnnamed959() {
+buildUnnamed520() {
   var o = new core.List<api.DictlayerdataDictWordsSenses>();
   o.add(buildDictlayerdataDictWordsSenses());
   o.add(buildDictlayerdataDictWordsSenses());
   return o;
 }
 
-checkUnnamed959(core.List<api.DictlayerdataDictWordsSenses> o) {
+checkUnnamed520(core.List<api.DictlayerdataDictWordsSenses> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSenses(o[0]);
   checkDictlayerdataDictWordsSenses(o[1]);
@@ -929,9 +929,9 @@
   var o = new api.DictlayerdataDictWords();
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    o.derivatives = buildUnnamed953();
-    o.examples = buildUnnamed954();
-    o.senses = buildUnnamed959();
+    o.derivatives = buildUnnamed514();
+    o.examples = buildUnnamed515();
+    o.senses = buildUnnamed520();
     o.source = buildDictlayerdataDictWordsSource();
   }
   buildCounterDictlayerdataDictWords--;
@@ -941,22 +941,22 @@
 checkDictlayerdataDictWords(api.DictlayerdataDictWords o) {
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    checkUnnamed953(o.derivatives);
-    checkUnnamed954(o.examples);
-    checkUnnamed959(o.senses);
+    checkUnnamed514(o.derivatives);
+    checkUnnamed515(o.examples);
+    checkUnnamed520(o.senses);
     checkDictlayerdataDictWordsSource(o.source);
   }
   buildCounterDictlayerdataDictWords--;
 }
 
-buildUnnamed960() {
+buildUnnamed521() {
   var o = new core.List<api.DictlayerdataDictWords>();
   o.add(buildDictlayerdataDictWords());
   o.add(buildDictlayerdataDictWords());
   return o;
 }
 
-checkUnnamed960(core.List<api.DictlayerdataDictWords> o) {
+checkUnnamed521(core.List<api.DictlayerdataDictWords> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWords(o[0]);
   checkDictlayerdataDictWords(o[1]);
@@ -968,7 +968,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     o.source = buildDictlayerdataDictSource();
-    o.words = buildUnnamed960();
+    o.words = buildUnnamed521();
   }
   buildCounterDictlayerdataDict--;
   return o;
@@ -978,7 +978,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     checkDictlayerdataDictSource(o.source);
-    checkUnnamed960(o.words);
+    checkUnnamed521(o.words);
   }
   buildCounterDictlayerdataDict--;
 }
@@ -1047,14 +1047,14 @@
   buildCounterDownloadAccessRestriction--;
 }
 
-buildUnnamed961() {
+buildUnnamed522() {
   var o = new core.List<api.DownloadAccessRestriction>();
   o.add(buildDownloadAccessRestriction());
   o.add(buildDownloadAccessRestriction());
   return o;
 }
 
-checkUnnamed961(core.List<api.DownloadAccessRestriction> o) {
+checkUnnamed522(core.List<api.DownloadAccessRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDownloadAccessRestriction(o[0]);
   checkDownloadAccessRestriction(o[1]);
@@ -1065,7 +1065,7 @@
   var o = new api.DownloadAccesses();
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    o.downloadAccessList = buildUnnamed961();
+    o.downloadAccessList = buildUnnamed522();
     o.kind = "foo";
   }
   buildCounterDownloadAccesses--;
@@ -1075,7 +1075,7 @@
 checkDownloadAccesses(api.DownloadAccesses o) {
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    checkUnnamed961(o.downloadAccessList);
+    checkUnnamed522(o.downloadAccessList);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDownloadAccesses--;
@@ -1129,30 +1129,30 @@
   buildCounterGeolayerdataGeoBoundary--;
 }
 
-buildUnnamed962() {
+buildUnnamed523() {
   var o = new core.List<api.GeolayerdataGeoBoundary>();
   o.add(buildGeolayerdataGeoBoundary());
   o.add(buildGeolayerdataGeoBoundary());
   return o;
 }
 
-checkUnnamed962(core.List<api.GeolayerdataGeoBoundary> o) {
+checkUnnamed523(core.List<api.GeolayerdataGeoBoundary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeolayerdataGeoBoundary(o[0]);
   checkGeolayerdataGeoBoundary(o[1]);
 }
 
-buildUnnamed963() {
+buildUnnamed524() {
   var o = new core.List<core.List<api.GeolayerdataGeoBoundary>>();
-  o.add(buildUnnamed962());
-  o.add(buildUnnamed962());
+  o.add(buildUnnamed523());
+  o.add(buildUnnamed523());
   return o;
 }
 
-checkUnnamed963(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
+checkUnnamed524(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed962(o[0]);
-  checkUnnamed962(o[1]);
+  checkUnnamed523(o[0]);
+  checkUnnamed523(o[1]);
 }
 
 core.int buildCounterGeolayerdataGeoViewportHi = 0;
@@ -1223,7 +1223,7 @@
   var o = new api.GeolayerdataGeo();
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    o.boundary = buildUnnamed963();
+    o.boundary = buildUnnamed524();
     o.cachePolicy = "foo";
     o.countryCode = "foo";
     o.latitude = 42.0;
@@ -1239,7 +1239,7 @@
 checkGeolayerdataGeo(api.GeolayerdataGeo o) {
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    checkUnnamed963(o.boundary);
+    checkUnnamed524(o.boundary);
     unittest.expect(o.cachePolicy, unittest.equals('foo'));
     unittest.expect(o.countryCode, unittest.equals('foo'));
     unittest.expect(o.latitude, unittest.equals(42.0));
@@ -1274,14 +1274,14 @@
   buildCounterGeolayerdata--;
 }
 
-buildUnnamed964() {
+buildUnnamed525() {
   var o = new core.List<api.Layersummary>();
   o.add(buildLayersummary());
   o.add(buildLayersummary());
   return o;
 }
 
-checkUnnamed964(core.List<api.Layersummary> o) {
+checkUnnamed525(core.List<api.Layersummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayersummary(o[0]);
   checkLayersummary(o[1]);
@@ -1292,7 +1292,7 @@
   var o = new api.Layersummaries();
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    o.items = buildUnnamed964();
+    o.items = buildUnnamed525();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -1303,21 +1303,21 @@
 checkLayersummaries(api.Layersummaries o) {
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    checkUnnamed964(o.items);
+    checkUnnamed525(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterLayersummaries--;
 }
 
-buildUnnamed965() {
+buildUnnamed526() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed965(core.List<core.String> o) {
+checkUnnamed526(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1329,7 +1329,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     o.annotationCount = 42;
-    o.annotationTypes = buildUnnamed965();
+    o.annotationTypes = buildUnnamed526();
     o.annotationsDataLink = "foo";
     o.annotationsLink = "foo";
     o.contentVersion = "foo";
@@ -1350,7 +1350,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     unittest.expect(o.annotationCount, unittest.equals(42));
-    checkUnnamed965(o.annotationTypes);
+    checkUnnamed526(o.annotationTypes);
     unittest.expect(o.annotationsDataLink, unittest.equals('foo'));
     unittest.expect(o.annotationsLink, unittest.equals('foo'));
     unittest.expect(o.contentVersion, unittest.equals('foo'));
@@ -1395,14 +1395,14 @@
   buildCounterOffersItemsItems--;
 }
 
-buildUnnamed966() {
+buildUnnamed527() {
   var o = new core.List<api.OffersItemsItems>();
   o.add(buildOffersItemsItems());
   o.add(buildOffersItemsItems());
   return o;
 }
 
-checkUnnamed966(core.List<api.OffersItemsItems> o) {
+checkUnnamed527(core.List<api.OffersItemsItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItemsItems(o[0]);
   checkOffersItemsItems(o[1]);
@@ -1415,7 +1415,7 @@
   if (buildCounterOffersItems < 3) {
     o.artUrl = "foo";
     o.id = "foo";
-    o.items = buildUnnamed966();
+    o.items = buildUnnamed527();
   }
   buildCounterOffersItems--;
   return o;
@@ -1426,19 +1426,19 @@
   if (buildCounterOffersItems < 3) {
     unittest.expect(o.artUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed966(o.items);
+    checkUnnamed527(o.items);
   }
   buildCounterOffersItems--;
 }
 
-buildUnnamed967() {
+buildUnnamed528() {
   var o = new core.List<api.OffersItems>();
   o.add(buildOffersItems());
   o.add(buildOffersItems());
   return o;
 }
 
-checkUnnamed967(core.List<api.OffersItems> o) {
+checkUnnamed528(core.List<api.OffersItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItems(o[0]);
   checkOffersItems(o[1]);
@@ -1449,7 +1449,7 @@
   var o = new api.Offers();
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    o.items = buildUnnamed967();
+    o.items = buildUnnamed528();
     o.kind = "foo";
   }
   buildCounterOffers--;
@@ -1459,7 +1459,7 @@
 checkOffers(api.Offers o) {
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    checkUnnamed967(o.items);
+    checkUnnamed528(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterOffers--;
@@ -1710,14 +1710,14 @@
   buildCounterVolumeLayerInfoLayers--;
 }
 
-buildUnnamed968() {
+buildUnnamed529() {
   var o = new core.List<api.VolumeLayerInfoLayers>();
   o.add(buildVolumeLayerInfoLayers());
   o.add(buildVolumeLayerInfoLayers());
   return o;
 }
 
-checkUnnamed968(core.List<api.VolumeLayerInfoLayers> o) {
+checkUnnamed529(core.List<api.VolumeLayerInfoLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeLayerInfoLayers(o[0]);
   checkVolumeLayerInfoLayers(o[1]);
@@ -1728,7 +1728,7 @@
   var o = new api.VolumeLayerInfo();
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    o.layers = buildUnnamed968();
+    o.layers = buildUnnamed529();
   }
   buildCounterVolumeLayerInfo--;
   return o;
@@ -1737,7 +1737,7 @@
 checkVolumeLayerInfo(api.VolumeLayerInfo o) {
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    checkUnnamed968(o.layers);
+    checkUnnamed529(o.layers);
   }
   buildCounterVolumeLayerInfo--;
 }
@@ -1870,14 +1870,14 @@
   buildCounterVolumeSaleInfoOffers--;
 }
 
-buildUnnamed969() {
+buildUnnamed530() {
   var o = new core.List<api.VolumeSaleInfoOffers>();
   o.add(buildVolumeSaleInfoOffers());
   o.add(buildVolumeSaleInfoOffers());
   return o;
 }
 
-checkUnnamed969(core.List<api.VolumeSaleInfoOffers> o) {
+checkUnnamed530(core.List<api.VolumeSaleInfoOffers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeSaleInfoOffers(o[0]);
   checkVolumeSaleInfoOffers(o[1]);
@@ -1913,7 +1913,7 @@
     o.country = "foo";
     o.isEbook = true;
     o.listPrice = buildVolumeSaleInfoListPrice();
-    o.offers = buildUnnamed969();
+    o.offers = buildUnnamed530();
     o.onSaleDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.retailPrice = buildVolumeSaleInfoRetailPrice();
     o.saleability = "foo";
@@ -1929,7 +1929,7 @@
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.isEbook, unittest.isTrue);
     checkVolumeSaleInfoListPrice(o.listPrice);
-    checkUnnamed969(o.offers);
+    checkUnnamed530(o.offers);
     unittest.expect(o.onSaleDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkVolumeSaleInfoRetailPrice(o.retailPrice);
     unittest.expect(o.saleability, unittest.equals('foo'));
@@ -2060,27 +2060,27 @@
   buildCounterVolumeUserInfo--;
 }
 
-buildUnnamed970() {
+buildUnnamed531() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed970(core.List<core.String> o) {
+checkUnnamed531(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed971() {
+buildUnnamed532() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed971(core.List<core.String> o) {
+checkUnnamed532(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2159,14 +2159,14 @@
   buildCounterVolumeVolumeInfoIndustryIdentifiers--;
 }
 
-buildUnnamed972() {
+buildUnnamed533() {
   var o = new core.List<api.VolumeVolumeInfoIndustryIdentifiers>();
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   return o;
 }
 
-checkUnnamed972(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
+checkUnnamed533(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeVolumeInfoIndustryIdentifiers(o[0]);
   checkVolumeVolumeInfoIndustryIdentifiers(o[1]);
@@ -2177,15 +2177,15 @@
   var o = new api.VolumeVolumeInfo();
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    o.authors = buildUnnamed970();
+    o.authors = buildUnnamed531();
     o.averageRating = 42.0;
     o.canonicalVolumeLink = "foo";
-    o.categories = buildUnnamed971();
+    o.categories = buildUnnamed532();
     o.contentVersion = "foo";
     o.description = "foo";
     o.dimensions = buildVolumeVolumeInfoDimensions();
     o.imageLinks = buildVolumeVolumeInfoImageLinks();
-    o.industryIdentifiers = buildUnnamed972();
+    o.industryIdentifiers = buildUnnamed533();
     o.infoLink = "foo";
     o.language = "foo";
     o.mainCategory = "foo";
@@ -2207,15 +2207,15 @@
 checkVolumeVolumeInfo(api.VolumeVolumeInfo o) {
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    checkUnnamed970(o.authors);
+    checkUnnamed531(o.authors);
     unittest.expect(o.averageRating, unittest.equals(42.0));
     unittest.expect(o.canonicalVolumeLink, unittest.equals('foo'));
-    checkUnnamed971(o.categories);
+    checkUnnamed532(o.categories);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkVolumeVolumeInfoDimensions(o.dimensions);
     checkVolumeVolumeInfoImageLinks(o.imageLinks);
-    checkUnnamed972(o.industryIdentifiers);
+    checkUnnamed533(o.industryIdentifiers);
     unittest.expect(o.infoLink, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mainCategory, unittest.equals('foo'));
@@ -2297,14 +2297,14 @@
   buildCounterVolumeannotationContentRanges--;
 }
 
-buildUnnamed973() {
+buildUnnamed534() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed973(core.List<core.String> o) {
+checkUnnamed534(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2324,7 +2324,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.layerId = "foo";
-    o.pageIds = buildUnnamed973();
+    o.pageIds = buildUnnamed534();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2346,7 +2346,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
-    checkUnnamed973(o.pageIds);
+    checkUnnamed534(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -2355,14 +2355,14 @@
   buildCounterVolumeannotation--;
 }
 
-buildUnnamed974() {
+buildUnnamed535() {
   var o = new core.List<api.Volumeannotation>();
   o.add(buildVolumeannotation());
   o.add(buildVolumeannotation());
   return o;
 }
 
-checkUnnamed974(core.List<api.Volumeannotation> o) {
+checkUnnamed535(core.List<api.Volumeannotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeannotation(o[0]);
   checkVolumeannotation(o[1]);
@@ -2373,7 +2373,7 @@
   var o = new api.Volumeannotations();
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    o.items = buildUnnamed974();
+    o.items = buildUnnamed535();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -2386,7 +2386,7 @@
 checkVolumeannotations(api.Volumeannotations o) {
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    checkUnnamed974(o.items);
+    checkUnnamed535(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -2395,14 +2395,14 @@
   buildCounterVolumeannotations--;
 }
 
-buildUnnamed975() {
+buildUnnamed536() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed975(core.List<api.Volume> o) {
+checkUnnamed536(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -2413,7 +2413,7 @@
   var o = new api.Volumes();
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    o.items = buildUnnamed975();
+    o.items = buildUnnamed536();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -2424,151 +2424,151 @@
 checkVolumes(api.Volumes o) {
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    checkUnnamed975(o.items);
+    checkUnnamed536(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterVolumes--;
 }
 
-buildUnnamed976() {
+buildUnnamed537() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed976(core.List<core.String> o) {
+checkUnnamed537(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed977() {
+buildUnnamed538() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed977(core.List<core.String> o) {
+checkUnnamed538(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed978() {
+buildUnnamed539() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed978(core.List<core.String> o) {
+checkUnnamed539(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed979() {
+buildUnnamed540() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed979(core.List<core.String> o) {
+checkUnnamed540(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed980() {
+buildUnnamed541() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed980(core.List<core.String> o) {
+checkUnnamed541(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed981() {
+buildUnnamed542() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed981(core.List<core.String> o) {
+checkUnnamed542(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed982() {
+buildUnnamed543() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed982(core.List<core.String> o) {
+checkUnnamed543(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed983() {
+buildUnnamed544() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed983(core.List<core.String> o) {
+checkUnnamed544(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed984() {
+buildUnnamed545() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed984(core.List<core.String> o) {
+checkUnnamed545(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed985() {
+buildUnnamed546() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed985(core.List<core.String> o) {
+checkUnnamed546(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed986() {
+buildUnnamed547() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed986(core.List<core.String> o) {
+checkUnnamed547(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3842,7 +3842,7 @@
       var arg_volumeId = "foo";
       var arg_layerId = "foo";
       var arg_contentVersion = "foo";
-      var arg_annotationDataId = buildUnnamed976();
+      var arg_annotationDataId = buildUnnamed537();
       var arg_h = 42;
       var arg_locale = "foo";
       var arg_maxResults = 42;
@@ -4082,7 +4082,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.MyconfigResourceApi res = new api.BooksApi(mock).myconfig;
-      var arg_volumeIds = buildUnnamed977();
+      var arg_volumeIds = buildUnnamed538();
       var arg_cpksver = "foo";
       var arg_locale = "foo";
       var arg_source = "foo";
@@ -4195,10 +4195,10 @@
       var arg_source = "foo";
       var arg_nonce = "foo";
       var arg_cpksver = "foo";
-      var arg_features = buildUnnamed978();
+      var arg_features = buildUnnamed539();
       var arg_locale = "foo";
       var arg_showPreorders = true;
-      var arg_volumeIds = buildUnnamed979();
+      var arg_volumeIds = buildUnnamed540();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4410,9 +4410,9 @@
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
       var arg_contentVersion = "foo";
       var arg_layerId = "foo";
-      var arg_layerIds = buildUnnamed980();
+      var arg_layerIds = buildUnnamed541();
       var arg_maxResults = 42;
-      var arg_pageIds = buildUnnamed981();
+      var arg_pageIds = buildUnnamed542();
       var arg_pageToken = "foo";
       var arg_showDeleted = true;
       var arg_source = "foo";
@@ -4475,7 +4475,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
-      var arg_layerIds = buildUnnamed982();
+      var arg_layerIds = buildUnnamed543();
       var arg_volumeId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
@@ -5468,10 +5468,10 @@
 
       var mock = new common_test.HttpServerMock();
       api.VolumesMybooksResourceApi res = new api.BooksApi(mock).volumes.mybooks;
-      var arg_acquireMethod = buildUnnamed983();
+      var arg_acquireMethod = buildUnnamed544();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed984();
+      var arg_processingState = buildUnnamed545();
       var arg_source = "foo";
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -5637,10 +5637,10 @@
       api.VolumesUseruploadedResourceApi res = new api.BooksApi(mock).volumes.useruploaded;
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed985();
+      var arg_processingState = buildUnnamed546();
       var arg_source = "foo";
       var arg_startIndex = 42;
-      var arg_volumeId = buildUnnamed986();
+      var arg_volumeId = buildUnnamed547();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index 1d0a459..7811a7c 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed126() {
+buildUnnamed675() {
   var o = new core.List<api.AclRule>();
   o.add(buildAclRule());
   o.add(buildAclRule());
   return o;
 }
 
-checkUnnamed126(core.List<api.AclRule> o) {
+checkUnnamed675(core.List<api.AclRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAclRule(o[0]);
   checkAclRule(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed126();
+    o.items = buildUnnamed675();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -48,7 +48,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed126(o.items);
+    checkUnnamed675(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -135,14 +135,14 @@
   buildCounterCalendar--;
 }
 
-buildUnnamed127() {
+buildUnnamed676() {
   var o = new core.List<api.CalendarListEntry>();
   o.add(buildCalendarListEntry());
   o.add(buildCalendarListEntry());
   return o;
 }
 
-checkUnnamed127(core.List<api.CalendarListEntry> o) {
+checkUnnamed676(core.List<api.CalendarListEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarListEntry(o[0]);
   checkCalendarListEntry(o[1]);
@@ -154,7 +154,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed127();
+    o.items = buildUnnamed676();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -167,7 +167,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed127(o.items);
+    checkUnnamed676(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -175,27 +175,27 @@
   buildCounterCalendarList--;
 }
 
-buildUnnamed128() {
+buildUnnamed677() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed128(core.List<api.EventReminder> o) {
+checkUnnamed677(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed129() {
+buildUnnamed678() {
   var o = new core.List<api.CalendarNotification>();
   o.add(buildCalendarNotification());
   o.add(buildCalendarNotification());
   return o;
 }
 
-checkUnnamed129(core.List<api.CalendarNotification> o) {
+checkUnnamed678(core.List<api.CalendarNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarNotification(o[0]);
   checkCalendarNotification(o[1]);
@@ -206,7 +206,7 @@
   var o = new api.CalendarListEntryNotificationSettings();
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    o.notifications = buildUnnamed129();
+    o.notifications = buildUnnamed678();
   }
   buildCounterCalendarListEntryNotificationSettings--;
   return o;
@@ -215,7 +215,7 @@
 checkCalendarListEntryNotificationSettings(api.CalendarListEntryNotificationSettings o) {
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    checkUnnamed129(o.notifications);
+    checkUnnamed678(o.notifications);
   }
   buildCounterCalendarListEntryNotificationSettings--;
 }
@@ -228,7 +228,7 @@
     o.accessRole = "foo";
     o.backgroundColor = "foo";
     o.colorId = "foo";
-    o.defaultReminders = buildUnnamed128();
+    o.defaultReminders = buildUnnamed677();
     o.deleted = true;
     o.description = "foo";
     o.etag = "foo";
@@ -254,7 +254,7 @@
     unittest.expect(o.accessRole, unittest.equals('foo'));
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.colorId, unittest.equals('foo'));
-    checkUnnamed128(o.defaultReminders);
+    checkUnnamed677(o.defaultReminders);
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -294,14 +294,14 @@
   buildCounterCalendarNotification--;
 }
 
-buildUnnamed130() {
+buildUnnamed679() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed130(core.Map<core.String, core.String> o) {
+checkUnnamed679(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -316,7 +316,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed130();
+    o.params = buildUnnamed679();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -334,7 +334,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed130(o.params);
+    checkUnnamed679(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -365,27 +365,27 @@
   buildCounterColorDefinition--;
 }
 
-buildUnnamed131() {
+buildUnnamed680() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed131(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed680(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
 }
 
-buildUnnamed132() {
+buildUnnamed681() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed132(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed681(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
@@ -396,8 +396,8 @@
   var o = new api.Colors();
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    o.calendar = buildUnnamed131();
-    o.event = buildUnnamed132();
+    o.calendar = buildUnnamed680();
+    o.event = buildUnnamed681();
     o.kind = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
   }
@@ -408,8 +408,8 @@
 checkColors(api.Colors o) {
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    checkUnnamed131(o.calendar);
-    checkUnnamed132(o.event);
+    checkUnnamed680(o.calendar);
+    checkUnnamed681(o.event);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
@@ -437,14 +437,14 @@
   buildCounterError--;
 }
 
-buildUnnamed133() {
+buildUnnamed682() {
   var o = new core.List<api.EventAttendee>();
   o.add(buildEventAttendee());
   o.add(buildEventAttendee());
   return o;
 }
 
-checkUnnamed133(core.List<api.EventAttendee> o) {
+checkUnnamed682(core.List<api.EventAttendee> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventAttendee(o[0]);
   checkEventAttendee(o[1]);
@@ -475,27 +475,27 @@
   buildCounterEventCreator--;
 }
 
-buildUnnamed134() {
+buildUnnamed683() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed134(core.Map<core.String, core.String> o) {
+checkUnnamed683(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed135() {
+buildUnnamed684() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed135(core.Map<core.String, core.String> o) {
+checkUnnamed684(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -506,8 +506,8 @@
   var o = new api.EventExtendedProperties();
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    o.private = buildUnnamed134();
-    o.shared = buildUnnamed135();
+    o.private = buildUnnamed683();
+    o.shared = buildUnnamed684();
   }
   buildCounterEventExtendedProperties--;
   return o;
@@ -516,20 +516,20 @@
 checkEventExtendedProperties(api.EventExtendedProperties o) {
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    checkUnnamed134(o.private);
-    checkUnnamed135(o.shared);
+    checkUnnamed683(o.private);
+    checkUnnamed684(o.shared);
   }
   buildCounterEventExtendedProperties--;
 }
 
-buildUnnamed136() {
+buildUnnamed685() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed136(core.Map<core.String, core.String> o) {
+checkUnnamed685(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -544,7 +544,7 @@
     o.height = 42;
     o.iconLink = "foo";
     o.link = "foo";
-    o.preferences = buildUnnamed136();
+    o.preferences = buildUnnamed685();
     o.title = "foo";
     o.type = "foo";
     o.width = 42;
@@ -560,7 +560,7 @@
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.iconLink, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
-    checkUnnamed136(o.preferences);
+    checkUnnamed685(o.preferences);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
@@ -593,27 +593,27 @@
   buildCounterEventOrganizer--;
 }
 
-buildUnnamed137() {
+buildUnnamed686() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed137(core.List<core.String> o) {
+checkUnnamed686(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed138() {
+buildUnnamed687() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed138(core.List<api.EventReminder> o) {
+checkUnnamed687(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
@@ -624,7 +624,7 @@
   var o = new api.EventReminders();
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    o.overrides = buildUnnamed138();
+    o.overrides = buildUnnamed687();
     o.useDefault = true;
   }
   buildCounterEventReminders--;
@@ -634,7 +634,7 @@
 checkEventReminders(api.EventReminders o) {
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    checkUnnamed138(o.overrides);
+    checkUnnamed687(o.overrides);
     unittest.expect(o.useDefault, unittest.isTrue);
   }
   buildCounterEventReminders--;
@@ -667,7 +667,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     o.anyoneCanAddSelf = true;
-    o.attendees = buildUnnamed133();
+    o.attendees = buildUnnamed682();
     o.attendeesOmitted = true;
     o.colorId = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -691,7 +691,7 @@
     o.organizer = buildEventOrganizer();
     o.originalStartTime = buildEventDateTime();
     o.privateCopy = true;
-    o.recurrence = buildUnnamed137();
+    o.recurrence = buildUnnamed686();
     o.recurringEventId = "foo";
     o.reminders = buildEventReminders();
     o.sequence = 42;
@@ -711,7 +711,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     unittest.expect(o.anyoneCanAddSelf, unittest.isTrue);
-    checkUnnamed133(o.attendees);
+    checkUnnamed682(o.attendees);
     unittest.expect(o.attendeesOmitted, unittest.isTrue);
     unittest.expect(o.colorId, unittest.equals('foo'));
     unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -735,7 +735,7 @@
     checkEventOrganizer(o.organizer);
     checkEventDateTime(o.originalStartTime);
     unittest.expect(o.privateCopy, unittest.isTrue);
-    checkUnnamed137(o.recurrence);
+    checkUnnamed686(o.recurrence);
     unittest.expect(o.recurringEventId, unittest.equals('foo'));
     checkEventReminders(o.reminders);
     unittest.expect(o.sequence, unittest.equals(42));
@@ -831,27 +831,27 @@
   buildCounterEventReminder--;
 }
 
-buildUnnamed139() {
+buildUnnamed688() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed139(core.List<api.EventReminder> o) {
+checkUnnamed688(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed140() {
+buildUnnamed689() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed140(core.List<api.Event> o) {
+checkUnnamed689(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -863,10 +863,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     o.accessRole = "foo";
-    o.defaultReminders = buildUnnamed139();
+    o.defaultReminders = buildUnnamed688();
     o.description = "foo";
     o.etag = "foo";
-    o.items = buildUnnamed140();
+    o.items = buildUnnamed689();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -882,10 +882,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     unittest.expect(o.accessRole, unittest.equals('foo'));
-    checkUnnamed139(o.defaultReminders);
+    checkUnnamed688(o.defaultReminders);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed140(o.items);
+    checkUnnamed689(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -896,27 +896,27 @@
   buildCounterEvents--;
 }
 
-buildUnnamed141() {
+buildUnnamed690() {
   var o = new core.List<api.TimePeriod>();
   o.add(buildTimePeriod());
   o.add(buildTimePeriod());
   return o;
 }
 
-checkUnnamed141(core.List<api.TimePeriod> o) {
+checkUnnamed690(core.List<api.TimePeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimePeriod(o[0]);
   checkTimePeriod(o[1]);
 }
 
-buildUnnamed142() {
+buildUnnamed691() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed142(core.List<api.Error> o) {
+checkUnnamed691(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -927,8 +927,8 @@
   var o = new api.FreeBusyCalendar();
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    o.busy = buildUnnamed141();
-    o.errors = buildUnnamed142();
+    o.busy = buildUnnamed690();
+    o.errors = buildUnnamed691();
   }
   buildCounterFreeBusyCalendar--;
   return o;
@@ -937,33 +937,33 @@
 checkFreeBusyCalendar(api.FreeBusyCalendar o) {
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    checkUnnamed141(o.busy);
-    checkUnnamed142(o.errors);
+    checkUnnamed690(o.busy);
+    checkUnnamed691(o.errors);
   }
   buildCounterFreeBusyCalendar--;
 }
 
-buildUnnamed143() {
+buildUnnamed692() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed143(core.List<core.String> o) {
+checkUnnamed692(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed144() {
+buildUnnamed693() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed144(core.List<api.Error> o) {
+checkUnnamed693(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -974,8 +974,8 @@
   var o = new api.FreeBusyGroup();
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    o.calendars = buildUnnamed143();
-    o.errors = buildUnnamed144();
+    o.calendars = buildUnnamed692();
+    o.errors = buildUnnamed693();
   }
   buildCounterFreeBusyGroup--;
   return o;
@@ -984,20 +984,20 @@
 checkFreeBusyGroup(api.FreeBusyGroup o) {
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    checkUnnamed143(o.calendars);
-    checkUnnamed144(o.errors);
+    checkUnnamed692(o.calendars);
+    checkUnnamed693(o.errors);
   }
   buildCounterFreeBusyGroup--;
 }
 
-buildUnnamed145() {
+buildUnnamed694() {
   var o = new core.List<api.FreeBusyRequestItem>();
   o.add(buildFreeBusyRequestItem());
   o.add(buildFreeBusyRequestItem());
   return o;
 }
 
-checkUnnamed145(core.List<api.FreeBusyRequestItem> o) {
+checkUnnamed694(core.List<api.FreeBusyRequestItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyRequestItem(o[0]);
   checkFreeBusyRequestItem(o[1]);
@@ -1010,7 +1010,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     o.calendarExpansionMax = 42;
     o.groupExpansionMax = 42;
-    o.items = buildUnnamed145();
+    o.items = buildUnnamed694();
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeZone = "foo";
@@ -1024,7 +1024,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     unittest.expect(o.calendarExpansionMax, unittest.equals(42));
     unittest.expect(o.groupExpansionMax, unittest.equals(42));
-    checkUnnamed145(o.items);
+    checkUnnamed694(o.items);
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeZone, unittest.equals('foo'));
@@ -1051,27 +1051,27 @@
   buildCounterFreeBusyRequestItem--;
 }
 
-buildUnnamed146() {
+buildUnnamed695() {
   var o = new core.Map<core.String, api.FreeBusyCalendar>();
   o["x"] = buildFreeBusyCalendar();
   o["y"] = buildFreeBusyCalendar();
   return o;
 }
 
-checkUnnamed146(core.Map<core.String, api.FreeBusyCalendar> o) {
+checkUnnamed695(core.Map<core.String, api.FreeBusyCalendar> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyCalendar(o["x"]);
   checkFreeBusyCalendar(o["y"]);
 }
 
-buildUnnamed147() {
+buildUnnamed696() {
   var o = new core.Map<core.String, api.FreeBusyGroup>();
   o["x"] = buildFreeBusyGroup();
   o["y"] = buildFreeBusyGroup();
   return o;
 }
 
-checkUnnamed147(core.Map<core.String, api.FreeBusyGroup> o) {
+checkUnnamed696(core.Map<core.String, api.FreeBusyGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyGroup(o["x"]);
   checkFreeBusyGroup(o["y"]);
@@ -1082,8 +1082,8 @@
   var o = new api.FreeBusyResponse();
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    o.calendars = buildUnnamed146();
-    o.groups = buildUnnamed147();
+    o.calendars = buildUnnamed695();
+    o.groups = buildUnnamed696();
     o.kind = "foo";
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
@@ -1095,8 +1095,8 @@
 checkFreeBusyResponse(api.FreeBusyResponse o) {
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    checkUnnamed146(o.calendars);
-    checkUnnamed147(o.groups);
+    checkUnnamed695(o.calendars);
+    checkUnnamed696(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1129,14 +1129,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed148() {
+buildUnnamed697() {
   var o = new core.List<api.Setting>();
   o.add(buildSetting());
   o.add(buildSetting());
   return o;
 }
 
-checkUnnamed148(core.List<api.Setting> o) {
+checkUnnamed697(core.List<api.Setting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetting(o[0]);
   checkSetting(o[1]);
@@ -1148,7 +1148,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed148();
+    o.items = buildUnnamed697();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -1161,7 +1161,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed148(o.items);
+    checkUnnamed697(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -1190,53 +1190,53 @@
   buildCounterTimePeriod--;
 }
 
-buildUnnamed149() {
+buildUnnamed698() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed149(core.List<core.String> o) {
+checkUnnamed698(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed150() {
+buildUnnamed699() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed150(core.List<core.String> o) {
+checkUnnamed699(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed151() {
+buildUnnamed700() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed151(core.List<core.String> o) {
+checkUnnamed700(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed152() {
+buildUnnamed701() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed152(core.List<core.String> o) {
+checkUnnamed701(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3058,9 +3058,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed149();
+      var arg_privateExtendedProperty = buildUnnamed698();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed150();
+      var arg_sharedExtendedProperty = buildUnnamed699();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
@@ -3402,9 +3402,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed151();
+      var arg_privateExtendedProperty = buildUnnamed700();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed152();
+      var arg_sharedExtendedProperty = buildUnnamed701();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
diff --git a/generated/googleapis/test/civicinfo/us_v1_test.dart b/generated/googleapis/test/civicinfo/us_v1_test.dart
index 5fc329e..6da838b 100644
--- a/generated/googleapis/test/civicinfo/us_v1_test.dart
+++ b/generated/googleapis/test/civicinfo/us_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed690() {
+buildUnnamed815() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed690(core.List<api.Source> o) {
+checkUnnamed815(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed690();
+    o.sources = buildUnnamed815();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed690(o.sources);
+    checkUnnamed815(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed691() {
+buildUnnamed816() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed691(core.List<api.ElectionOfficial> o) {
+checkUnnamed816(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed692() {
+buildUnnamed817() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed692(core.List<core.String> o) {
+checkUnnamed817(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed691();
+    o.electionOfficials = buildUnnamed816();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed692();
+    o.voterServices = buildUnnamed817();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed691(o.electionOfficials);
+    checkUnnamed816(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed692(o.voterServices);
+    checkUnnamed817(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed693() {
+buildUnnamed818() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed693(core.List<api.Channel> o) {
+checkUnnamed818(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed693();
+    o.channels = buildUnnamed818();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed693(o.channels);
+    checkUnnamed818(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,27 +192,27 @@
   buildCounterChannel--;
 }
 
-buildUnnamed694() {
+buildUnnamed819() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed694(core.List<api.Candidate> o) {
+checkUnnamed819(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed695() {
+buildUnnamed820() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed695(core.List<api.Source> o) {
+checkUnnamed820(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -224,7 +224,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed694();
+    o.candidates = buildUnnamed819();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
@@ -236,7 +236,7 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.sources = buildUnnamed695();
+    o.sources = buildUnnamed820();
     o.special = "foo";
     o.type = "foo";
   }
@@ -248,7 +248,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed694(o.candidates);
+    checkUnnamed819(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -260,21 +260,21 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed695(o.sources);
+    checkUnnamed820(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed696() {
+buildUnnamed821() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed696(core.List<api.DivisionSearchResult> o) {
+checkUnnamed821(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -286,7 +286,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed696();
+    o.results = buildUnnamed821();
     o.status = "foo";
   }
   buildCounterDivisionSearchResponse--;
@@ -297,20 +297,20 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed696(o.results);
+    checkUnnamed821(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed697() {
+buildUnnamed822() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed697(core.List<core.String> o) {
+checkUnnamed822(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -321,7 +321,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed697();
+    o.aliases = buildUnnamed822();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -332,7 +332,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed697(o.aliases);
+    checkUnnamed822(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -389,14 +389,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed698() {
+buildUnnamed823() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed698(core.List<api.Election> o) {
+checkUnnamed823(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -407,7 +407,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed698();
+    o.elections = buildUnnamed823();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -417,7 +417,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed698(o.elections);
+    checkUnnamed823(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -446,27 +446,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed699() {
+buildUnnamed824() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed699(core.List<core.String> o) {
+checkUnnamed824(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed700() {
+buildUnnamed825() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed700(core.List<core.String> o) {
+checkUnnamed825(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -477,9 +477,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed699();
+    o.alsoKnownAs = buildUnnamed824();
     o.name = "foo";
-    o.officeIds = buildUnnamed700();
+    o.officeIds = buildUnnamed825();
     o.scope = "foo";
   }
   buildCounterGeographicDivision--;
@@ -489,35 +489,35 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed699(o.alsoKnownAs);
+    checkUnnamed824(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed700(o.officeIds);
+    checkUnnamed825(o.officeIds);
     unittest.expect(o.scope, unittest.equals('foo'));
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed701() {
+buildUnnamed826() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed701(core.List<core.String> o) {
+checkUnnamed826(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed702() {
+buildUnnamed827() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed702(core.List<api.Source> o) {
+checkUnnamed827(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -531,8 +531,8 @@
     o.divisionId = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.officialIds = buildUnnamed701();
-    o.sources = buildUnnamed702();
+    o.officialIds = buildUnnamed826();
+    o.sources = buildUnnamed827();
   }
   buildCounterOffice--;
   return o;
@@ -544,72 +544,72 @@
     unittest.expect(o.divisionId, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed701(o.officialIds);
-    checkUnnamed702(o.sources);
+    checkUnnamed826(o.officialIds);
+    checkUnnamed827(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed703() {
+buildUnnamed828() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed703(core.List<api.SimpleAddressType> o) {
+checkUnnamed828(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed704() {
+buildUnnamed829() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed704(core.List<api.Channel> o) {
+checkUnnamed829(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed705() {
+buildUnnamed830() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed705(core.List<core.String> o) {
+checkUnnamed830(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed706() {
+buildUnnamed831() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed706(core.List<core.String> o) {
+checkUnnamed831(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed707() {
+buildUnnamed832() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed707(core.List<core.String> o) {
+checkUnnamed832(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -620,14 +620,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed703();
-    o.channels = buildUnnamed704();
-    o.emails = buildUnnamed705();
+    o.address = buildUnnamed828();
+    o.channels = buildUnnamed829();
+    o.emails = buildUnnamed830();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed706();
+    o.phones = buildUnnamed831();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed707();
+    o.urls = buildUnnamed832();
   }
   buildCounterOfficial--;
   return o;
@@ -636,26 +636,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed703(o.address);
-    checkUnnamed704(o.channels);
-    checkUnnamed705(o.emails);
+    checkUnnamed828(o.address);
+    checkUnnamed829(o.channels);
+    checkUnnamed830(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed706(o.phones);
+    checkUnnamed831(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed707(o.urls);
+    checkUnnamed832(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed708() {
+buildUnnamed833() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed708(core.List<api.Source> o) {
+checkUnnamed833(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -672,7 +672,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed708();
+    o.sources = buildUnnamed833();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -689,7 +689,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed708(o.sources);
+    checkUnnamed833(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
@@ -715,40 +715,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed709() {
+buildUnnamed834() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed709(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed834(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed710() {
+buildUnnamed835() {
   var o = new core.Map<core.String, api.Office>();
   o["x"] = buildOffice();
   o["y"] = buildOffice();
   return o;
 }
 
-checkUnnamed710(core.Map<core.String, api.Office> o) {
+checkUnnamed835(core.Map<core.String, api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o["x"]);
   checkOffice(o["y"]);
 }
 
-buildUnnamed711() {
+buildUnnamed836() {
   var o = new core.Map<core.String, api.Official>();
   o["x"] = buildOfficial();
   o["y"] = buildOfficial();
   return o;
 }
 
-checkUnnamed711(core.Map<core.String, api.Official> o) {
+checkUnnamed836(core.Map<core.String, api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o["x"]);
   checkOfficial(o["y"]);
@@ -759,11 +759,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed709();
+    o.divisions = buildUnnamed834();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed710();
-    o.officials = buildUnnamed711();
+    o.offices = buildUnnamed835();
+    o.officials = buildUnnamed836();
     o.status = "foo";
   }
   buildCounterRepresentativeInfoResponse--;
@@ -773,11 +773,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed709(o.divisions);
+    checkUnnamed834(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed710(o.offices);
-    checkUnnamed711(o.officials);
+    checkUnnamed835(o.offices);
+    checkUnnamed836(o.officials);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterRepresentativeInfoResponse--;
@@ -854,53 +854,53 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed712() {
+buildUnnamed837() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed712(core.List<api.Contest> o) {
+checkUnnamed837(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed713() {
+buildUnnamed838() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed713(core.List<api.PollingLocation> o) {
+checkUnnamed838(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed714() {
+buildUnnamed839() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed714(core.List<api.PollingLocation> o) {
+checkUnnamed839(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed715() {
+buildUnnamed840() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed715(core.List<api.AdministrationRegion> o) {
+checkUnnamed840(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -911,14 +911,14 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed712();
-    o.earlyVoteSites = buildUnnamed713();
+    o.contests = buildUnnamed837();
+    o.earlyVoteSites = buildUnnamed838();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.pollingLocations = buildUnnamed714();
+    o.pollingLocations = buildUnnamed839();
     o.precinctId = "foo";
-    o.state = buildUnnamed715();
+    o.state = buildUnnamed840();
     o.status = "foo";
   }
   buildCounterVoterInfoResponse--;
@@ -928,14 +928,14 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed712(o.contests);
-    checkUnnamed713(o.earlyVoteSites);
+    checkUnnamed837(o.contests);
+    checkUnnamed838(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed714(o.pollingLocations);
+    checkUnnamed839(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed715(o.state);
+    checkUnnamed840(o.state);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterVoterInfoResponse--;
diff --git a/generated/googleapis/test/civicinfo/v1_test.dart b/generated/googleapis/test/civicinfo/v1_test.dart
index bf4a05d..3eca67c 100644
--- a/generated/googleapis/test/civicinfo/v1_test.dart
+++ b/generated/googleapis/test/civicinfo/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed439() {
+buildUnnamed65() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed439(core.List<api.Source> o) {
+checkUnnamed65(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed439();
+    o.sources = buildUnnamed65();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed439(o.sources);
+    checkUnnamed65(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed440() {
+buildUnnamed66() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed440(core.List<api.ElectionOfficial> o) {
+checkUnnamed66(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed441() {
+buildUnnamed67() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed441(core.List<core.String> o) {
+checkUnnamed67(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed440();
+    o.electionOfficials = buildUnnamed66();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed441();
+    o.voterServices = buildUnnamed67();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed440(o.electionOfficials);
+    checkUnnamed66(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed441(o.voterServices);
+    checkUnnamed67(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed442() {
+buildUnnamed68() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed442(core.List<api.Channel> o) {
+checkUnnamed68(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed442();
+    o.channels = buildUnnamed68();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed442(o.channels);
+    checkUnnamed68(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,27 +192,27 @@
   buildCounterChannel--;
 }
 
-buildUnnamed443() {
+buildUnnamed69() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed443(core.List<api.Candidate> o) {
+checkUnnamed69(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed444() {
+buildUnnamed70() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed444(core.List<api.Source> o) {
+checkUnnamed70(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -224,7 +224,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed443();
+    o.candidates = buildUnnamed69();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
@@ -236,7 +236,7 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.sources = buildUnnamed444();
+    o.sources = buildUnnamed70();
     o.special = "foo";
     o.type = "foo";
   }
@@ -248,7 +248,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed443(o.candidates);
+    checkUnnamed69(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -260,21 +260,21 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed444(o.sources);
+    checkUnnamed70(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed445() {
+buildUnnamed71() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed445(core.List<api.DivisionSearchResult> o) {
+checkUnnamed71(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -286,7 +286,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed445();
+    o.results = buildUnnamed71();
     o.status = "foo";
   }
   buildCounterDivisionSearchResponse--;
@@ -297,20 +297,20 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed445(o.results);
+    checkUnnamed71(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed446() {
+buildUnnamed72() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed446(core.List<core.String> o) {
+checkUnnamed72(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -321,7 +321,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed446();
+    o.aliases = buildUnnamed72();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -332,7 +332,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed446(o.aliases);
+    checkUnnamed72(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -389,14 +389,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed447() {
+buildUnnamed73() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed447(core.List<api.Election> o) {
+checkUnnamed73(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -407,7 +407,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed447();
+    o.elections = buildUnnamed73();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -417,7 +417,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed447(o.elections);
+    checkUnnamed73(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -446,27 +446,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed448() {
+buildUnnamed74() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed448(core.List<core.String> o) {
+checkUnnamed74(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed449() {
+buildUnnamed75() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed449(core.List<core.String> o) {
+checkUnnamed75(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -477,9 +477,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed448();
+    o.alsoKnownAs = buildUnnamed74();
     o.name = "foo";
-    o.officeIds = buildUnnamed449();
+    o.officeIds = buildUnnamed75();
     o.scope = "foo";
   }
   buildCounterGeographicDivision--;
@@ -489,35 +489,35 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed448(o.alsoKnownAs);
+    checkUnnamed74(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed449(o.officeIds);
+    checkUnnamed75(o.officeIds);
     unittest.expect(o.scope, unittest.equals('foo'));
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed450() {
+buildUnnamed76() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed450(core.List<core.String> o) {
+checkUnnamed76(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed451() {
+buildUnnamed77() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed451(core.List<api.Source> o) {
+checkUnnamed77(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -531,8 +531,8 @@
     o.divisionId = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.officialIds = buildUnnamed450();
-    o.sources = buildUnnamed451();
+    o.officialIds = buildUnnamed76();
+    o.sources = buildUnnamed77();
   }
   buildCounterOffice--;
   return o;
@@ -544,72 +544,72 @@
     unittest.expect(o.divisionId, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed450(o.officialIds);
-    checkUnnamed451(o.sources);
+    checkUnnamed76(o.officialIds);
+    checkUnnamed77(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed452() {
+buildUnnamed78() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed452(core.List<api.SimpleAddressType> o) {
+checkUnnamed78(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed453() {
+buildUnnamed79() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed453(core.List<api.Channel> o) {
+checkUnnamed79(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed454() {
+buildUnnamed80() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed454(core.List<core.String> o) {
+checkUnnamed80(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed455() {
+buildUnnamed81() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed455(core.List<core.String> o) {
+checkUnnamed81(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed456() {
+buildUnnamed82() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed456(core.List<core.String> o) {
+checkUnnamed82(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -620,14 +620,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed452();
-    o.channels = buildUnnamed453();
-    o.emails = buildUnnamed454();
+    o.address = buildUnnamed78();
+    o.channels = buildUnnamed79();
+    o.emails = buildUnnamed80();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed455();
+    o.phones = buildUnnamed81();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed456();
+    o.urls = buildUnnamed82();
   }
   buildCounterOfficial--;
   return o;
@@ -636,26 +636,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed452(o.address);
-    checkUnnamed453(o.channels);
-    checkUnnamed454(o.emails);
+    checkUnnamed78(o.address);
+    checkUnnamed79(o.channels);
+    checkUnnamed80(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed455(o.phones);
+    checkUnnamed81(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed456(o.urls);
+    checkUnnamed82(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed457() {
+buildUnnamed83() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed457(core.List<api.Source> o) {
+checkUnnamed83(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -672,7 +672,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed457();
+    o.sources = buildUnnamed83();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -689,7 +689,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed457(o.sources);
+    checkUnnamed83(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
@@ -715,40 +715,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed458() {
+buildUnnamed84() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed458(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed84(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed459() {
+buildUnnamed85() {
   var o = new core.Map<core.String, api.Office>();
   o["x"] = buildOffice();
   o["y"] = buildOffice();
   return o;
 }
 
-checkUnnamed459(core.Map<core.String, api.Office> o) {
+checkUnnamed85(core.Map<core.String, api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o["x"]);
   checkOffice(o["y"]);
 }
 
-buildUnnamed460() {
+buildUnnamed86() {
   var o = new core.Map<core.String, api.Official>();
   o["x"] = buildOfficial();
   o["y"] = buildOfficial();
   return o;
 }
 
-checkUnnamed460(core.Map<core.String, api.Official> o) {
+checkUnnamed86(core.Map<core.String, api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o["x"]);
   checkOfficial(o["y"]);
@@ -759,11 +759,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed458();
+    o.divisions = buildUnnamed84();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed459();
-    o.officials = buildUnnamed460();
+    o.offices = buildUnnamed85();
+    o.officials = buildUnnamed86();
     o.status = "foo";
   }
   buildCounterRepresentativeInfoResponse--;
@@ -773,11 +773,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed458(o.divisions);
+    checkUnnamed84(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed459(o.offices);
-    checkUnnamed460(o.officials);
+    checkUnnamed85(o.offices);
+    checkUnnamed86(o.officials);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterRepresentativeInfoResponse--;
@@ -854,53 +854,53 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed461() {
+buildUnnamed87() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed461(core.List<api.Contest> o) {
+checkUnnamed87(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed462() {
+buildUnnamed88() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed462(core.List<api.PollingLocation> o) {
+checkUnnamed88(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed463() {
+buildUnnamed89() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed463(core.List<api.PollingLocation> o) {
+checkUnnamed89(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed464() {
+buildUnnamed90() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed464(core.List<api.AdministrationRegion> o) {
+checkUnnamed90(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -911,14 +911,14 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed461();
-    o.earlyVoteSites = buildUnnamed462();
+    o.contests = buildUnnamed87();
+    o.earlyVoteSites = buildUnnamed88();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.pollingLocations = buildUnnamed463();
+    o.pollingLocations = buildUnnamed89();
     o.precinctId = "foo";
-    o.state = buildUnnamed464();
+    o.state = buildUnnamed90();
     o.status = "foo";
   }
   buildCounterVoterInfoResponse--;
@@ -928,14 +928,14 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed461(o.contests);
-    checkUnnamed462(o.earlyVoteSites);
+    checkUnnamed87(o.contests);
+    checkUnnamed88(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed463(o.pollingLocations);
+    checkUnnamed89(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed464(o.state);
+    checkUnnamed90(o.state);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterVoterInfoResponse--;
diff --git a/generated/googleapis/test/civicinfo/v2_test.dart b/generated/googleapis/test/civicinfo/v2_test.dart
index fc2ce77..735c213 100644
--- a/generated/googleapis/test/civicinfo/v2_test.dart
+++ b/generated/googleapis/test/civicinfo/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed182() {
+buildUnnamed981() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed182(core.List<api.Source> o) {
+checkUnnamed981(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed182();
+    o.sources = buildUnnamed981();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed182(o.sources);
+    checkUnnamed981(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed183() {
+buildUnnamed982() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed183(core.List<api.ElectionOfficial> o) {
+checkUnnamed982(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed184() {
+buildUnnamed983() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed184(core.List<core.String> o) {
+checkUnnamed983(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed183();
+    o.electionOfficials = buildUnnamed982();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed184();
+    o.voterServices = buildUnnamed983();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed183(o.electionOfficials);
+    checkUnnamed982(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed184(o.voterServices);
+    checkUnnamed983(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed185() {
+buildUnnamed984() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed185(core.List<api.Channel> o) {
+checkUnnamed984(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed185();
+    o.channels = buildUnnamed984();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed185(o.channels);
+    checkUnnamed984(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,53 +192,53 @@
   buildCounterChannel--;
 }
 
-buildUnnamed186() {
+buildUnnamed985() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed186(core.List<api.Candidate> o) {
+checkUnnamed985(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed187() {
+buildUnnamed986() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed187(core.List<core.String> o) {
+checkUnnamed986(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed188() {
+buildUnnamed987() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed188(core.List<core.String> o) {
+checkUnnamed987(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed189() {
+buildUnnamed988() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed189(core.List<api.Source> o) {
+checkUnnamed988(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -250,11 +250,11 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed186();
+    o.candidates = buildUnnamed985();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
-    o.level = buildUnnamed187();
+    o.level = buildUnnamed986();
     o.numberElected = "foo";
     o.numberVotingFor = "foo";
     o.office = "foo";
@@ -262,8 +262,8 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.roles = buildUnnamed188();
-    o.sources = buildUnnamed189();
+    o.roles = buildUnnamed987();
+    o.sources = buildUnnamed988();
     o.special = "foo";
     o.type = "foo";
   }
@@ -275,11 +275,11 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed186(o.candidates);
+    checkUnnamed985(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed187(o.level);
+    checkUnnamed986(o.level);
     unittest.expect(o.numberElected, unittest.equals('foo'));
     unittest.expect(o.numberVotingFor, unittest.equals('foo'));
     unittest.expect(o.office, unittest.equals('foo'));
@@ -287,22 +287,22 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed188(o.roles);
-    checkUnnamed189(o.sources);
+    checkUnnamed987(o.roles);
+    checkUnnamed988(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed190() {
+buildUnnamed989() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed190(core.List<api.DivisionSearchResult> o) {
+checkUnnamed989(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -314,7 +314,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed190();
+    o.results = buildUnnamed989();
   }
   buildCounterDivisionSearchResponse--;
   return o;
@@ -324,19 +324,19 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed190(o.results);
+    checkUnnamed989(o.results);
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed191() {
+buildUnnamed990() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed191(core.List<core.String> o) {
+checkUnnamed990(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -347,7 +347,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed191();
+    o.aliases = buildUnnamed990();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -358,7 +358,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed191(o.aliases);
+    checkUnnamed990(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -415,14 +415,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed192() {
+buildUnnamed991() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed192(core.List<api.Election> o) {
+checkUnnamed991(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -433,7 +433,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed192();
+    o.elections = buildUnnamed991();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -443,7 +443,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed192(o.elections);
+    checkUnnamed991(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -472,27 +472,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed193() {
+buildUnnamed992() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed193(core.List<core.String> o) {
+checkUnnamed992(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed194() {
+buildUnnamed993() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed194(core.List<core.int> o) {
+checkUnnamed993(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -503,9 +503,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed193();
+    o.alsoKnownAs = buildUnnamed992();
     o.name = "foo";
-    o.officeIndices = buildUnnamed194();
+    o.officeIndices = buildUnnamed993();
   }
   buildCounterGeographicDivision--;
   return o;
@@ -514,60 +514,60 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed193(o.alsoKnownAs);
+    checkUnnamed992(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed194(o.officeIndices);
+    checkUnnamed993(o.officeIndices);
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed195() {
+buildUnnamed994() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed195(core.List<core.String> o) {
+checkUnnamed994(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed196() {
+buildUnnamed995() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed196(core.List<core.int> o) {
+checkUnnamed995(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed197() {
+buildUnnamed996() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed197(core.List<core.String> o) {
+checkUnnamed996(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed198() {
+buildUnnamed997() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed198(core.List<api.Source> o) {
+checkUnnamed997(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -579,11 +579,11 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     o.divisionId = "foo";
-    o.levels = buildUnnamed195();
+    o.levels = buildUnnamed994();
     o.name = "foo";
-    o.officialIndices = buildUnnamed196();
-    o.roles = buildUnnamed197();
-    o.sources = buildUnnamed198();
+    o.officialIndices = buildUnnamed995();
+    o.roles = buildUnnamed996();
+    o.sources = buildUnnamed997();
   }
   buildCounterOffice--;
   return o;
@@ -593,75 +593,75 @@
   buildCounterOffice++;
   if (buildCounterOffice < 3) {
     unittest.expect(o.divisionId, unittest.equals('foo'));
-    checkUnnamed195(o.levels);
+    checkUnnamed994(o.levels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed196(o.officialIndices);
-    checkUnnamed197(o.roles);
-    checkUnnamed198(o.sources);
+    checkUnnamed995(o.officialIndices);
+    checkUnnamed996(o.roles);
+    checkUnnamed997(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed199() {
+buildUnnamed998() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed199(core.List<api.SimpleAddressType> o) {
+checkUnnamed998(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed200() {
+buildUnnamed999() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed200(core.List<api.Channel> o) {
+checkUnnamed999(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed201() {
+buildUnnamed1000() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed201(core.List<core.String> o) {
+checkUnnamed1000(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed202() {
+buildUnnamed1001() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed202(core.List<core.String> o) {
+checkUnnamed1001(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed203() {
+buildUnnamed1002() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed203(core.List<core.String> o) {
+checkUnnamed1002(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -672,14 +672,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed199();
-    o.channels = buildUnnamed200();
-    o.emails = buildUnnamed201();
+    o.address = buildUnnamed998();
+    o.channels = buildUnnamed999();
+    o.emails = buildUnnamed1000();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed202();
+    o.phones = buildUnnamed1001();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed203();
+    o.urls = buildUnnamed1002();
   }
   buildCounterOfficial--;
   return o;
@@ -688,26 +688,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed199(o.address);
-    checkUnnamed200(o.channels);
-    checkUnnamed201(o.emails);
+    checkUnnamed998(o.address);
+    checkUnnamed999(o.channels);
+    checkUnnamed1000(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed202(o.phones);
+    checkUnnamed1001(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed203(o.urls);
+    checkUnnamed1002(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed204() {
+buildUnnamed1003() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed204(core.List<api.Source> o) {
+checkUnnamed1003(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -724,7 +724,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed204();
+    o.sources = buildUnnamed1003();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -741,47 +741,47 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed204(o.sources);
+    checkUnnamed1003(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
   buildCounterPollingLocation--;
 }
 
-buildUnnamed205() {
+buildUnnamed1004() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed205(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed1004(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed206() {
+buildUnnamed1005() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed206(core.List<api.Office> o) {
+checkUnnamed1005(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed207() {
+buildUnnamed1006() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed207(core.List<api.Official> o) {
+checkUnnamed1006(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -792,9 +792,9 @@
   var o = new api.RepresentativeInfoData();
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    o.divisions = buildUnnamed205();
-    o.offices = buildUnnamed206();
-    o.officials = buildUnnamed207();
+    o.divisions = buildUnnamed1004();
+    o.offices = buildUnnamed1005();
+    o.officials = buildUnnamed1006();
   }
   buildCounterRepresentativeInfoData--;
   return o;
@@ -803,47 +803,47 @@
 checkRepresentativeInfoData(api.RepresentativeInfoData o) {
   buildCounterRepresentativeInfoData++;
   if (buildCounterRepresentativeInfoData < 3) {
-    checkUnnamed205(o.divisions);
-    checkUnnamed206(o.offices);
-    checkUnnamed207(o.officials);
+    checkUnnamed1004(o.divisions);
+    checkUnnamed1005(o.offices);
+    checkUnnamed1006(o.officials);
   }
   buildCounterRepresentativeInfoData--;
 }
 
-buildUnnamed208() {
+buildUnnamed1007() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed208(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed1007(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed209() {
+buildUnnamed1008() {
   var o = new core.List<api.Office>();
   o.add(buildOffice());
   o.add(buildOffice());
   return o;
 }
 
-checkUnnamed209(core.List<api.Office> o) {
+checkUnnamed1008(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o[0]);
   checkOffice(o[1]);
 }
 
-buildUnnamed210() {
+buildUnnamed1009() {
   var o = new core.List<api.Official>();
   o.add(buildOfficial());
   o.add(buildOfficial());
   return o;
 }
 
-checkUnnamed210(core.List<api.Official> o) {
+checkUnnamed1009(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o[0]);
   checkOfficial(o[1]);
@@ -854,11 +854,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed208();
+    o.divisions = buildUnnamed1007();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed209();
-    o.officials = buildUnnamed210();
+    o.offices = buildUnnamed1008();
+    o.officials = buildUnnamed1009();
   }
   buildCounterRepresentativeInfoResponse--;
   return o;
@@ -867,11 +867,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed208(o.divisions);
+    checkUnnamed1007(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed209(o.offices);
-    checkUnnamed210(o.officials);
+    checkUnnamed1008(o.offices);
+    checkUnnamed1009(o.officials);
   }
   buildCounterRepresentativeInfoResponse--;
 }
@@ -928,66 +928,66 @@
   buildCounterSource--;
 }
 
-buildUnnamed211() {
+buildUnnamed1010() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed211(core.List<api.Contest> o) {
+checkUnnamed1010(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed212() {
+buildUnnamed1011() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed212(core.List<api.PollingLocation> o) {
+checkUnnamed1011(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed213() {
+buildUnnamed1012() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed213(core.List<api.Election> o) {
+checkUnnamed1012(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
 }
 
-buildUnnamed214() {
+buildUnnamed1013() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed214(core.List<api.PollingLocation> o) {
+checkUnnamed1013(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed215() {
+buildUnnamed1014() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed215(core.List<api.AdministrationRegion> o) {
+checkUnnamed1014(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -998,15 +998,15 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed211();
-    o.earlyVoteSites = buildUnnamed212();
+    o.contests = buildUnnamed1010();
+    o.earlyVoteSites = buildUnnamed1011();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.otherElections = buildUnnamed213();
-    o.pollingLocations = buildUnnamed214();
+    o.otherElections = buildUnnamed1012();
+    o.pollingLocations = buildUnnamed1013();
     o.precinctId = "foo";
-    o.state = buildUnnamed215();
+    o.state = buildUnnamed1014();
   }
   buildCounterVoterInfoResponse--;
   return o;
@@ -1015,66 +1015,66 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed211(o.contests);
-    checkUnnamed212(o.earlyVoteSites);
+    checkUnnamed1010(o.contests);
+    checkUnnamed1011(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed213(o.otherElections);
-    checkUnnamed214(o.pollingLocations);
+    checkUnnamed1012(o.otherElections);
+    checkUnnamed1013(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
-    checkUnnamed215(o.state);
+    checkUnnamed1014(o.state);
   }
   buildCounterVoterInfoResponse--;
 }
 
-buildUnnamed216() {
+buildUnnamed1015() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed216(core.List<core.String> o) {
+checkUnnamed1015(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed217() {
+buildUnnamed1016() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed217(core.List<core.String> o) {
+checkUnnamed1016(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed218() {
+buildUnnamed1017() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed218(core.List<core.String> o) {
+checkUnnamed1017(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed219() {
+buildUnnamed1018() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed219(core.List<core.String> o) {
+checkUnnamed1018(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1420,8 +1420,8 @@
       api.RepresentativesResourceApi res = new api.CivicinfoApi(mock).representatives;
       var arg_address = "foo";
       var arg_includeOffices = true;
-      var arg_levels = buildUnnamed216();
-      var arg_roles = buildUnnamed217();
+      var arg_levels = buildUnnamed1015();
+      var arg_roles = buildUnnamed1016();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1472,9 +1472,9 @@
       var mock = new common_test.HttpServerMock();
       api.RepresentativesResourceApi res = new api.CivicinfoApi(mock).representatives;
       var arg_ocdId = "foo";
-      var arg_levels = buildUnnamed218();
+      var arg_levels = buildUnnamed1017();
       var arg_recursive = true;
-      var arg_roles = buildUnnamed219();
+      var arg_roles = buildUnnamed1018();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index 3cf7f5d..df2adbe 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed822() {
+buildUnnamed873() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed822(core.List<core.String> o) {
+checkUnnamed873(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -68,7 +68,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.users = buildUnnamed822();
+    o.users = buildUnnamed873();
   }
   buildCounterAddress--;
   return o;
@@ -86,19 +86,19 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed822(o.users);
+    checkUnnamed873(o.users);
   }
   buildCounterAddress--;
 }
 
-buildUnnamed823() {
+buildUnnamed874() {
   var o = new core.Map<core.String, api.AddressesScopedList>();
   o["x"] = buildAddressesScopedList();
   o["y"] = buildAddressesScopedList();
   return o;
 }
 
-checkUnnamed823(core.Map<core.String, api.AddressesScopedList> o) {
+checkUnnamed874(core.Map<core.String, api.AddressesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedList(o["x"]);
   checkAddressesScopedList(o["y"]);
@@ -110,7 +110,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed823();
+    o.items = buildUnnamed874();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -123,7 +123,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed823(o.items);
+    checkUnnamed874(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -131,14 +131,14 @@
   buildCounterAddressAggregatedList--;
 }
 
-buildUnnamed824() {
+buildUnnamed875() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed824(core.List<api.Address> o) {
+checkUnnamed875(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed824();
+    o.items = buildUnnamed875();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -163,7 +163,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed824(o.items);
+    checkUnnamed875(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -171,14 +171,14 @@
   buildCounterAddressList--;
 }
 
-buildUnnamed825() {
+buildUnnamed876() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed825(core.List<api.Address> o) {
+checkUnnamed876(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -205,14 +205,14 @@
   buildCounterAddressesScopedListWarningData--;
 }
 
-buildUnnamed826() {
+buildUnnamed877() {
   var o = new core.List<api.AddressesScopedListWarningData>();
   o.add(buildAddressesScopedListWarningData());
   o.add(buildAddressesScopedListWarningData());
   return o;
 }
 
-checkUnnamed826(core.List<api.AddressesScopedListWarningData> o) {
+checkUnnamed877(core.List<api.AddressesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedListWarningData(o[0]);
   checkAddressesScopedListWarningData(o[1]);
@@ -224,7 +224,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed826();
+    o.data = buildUnnamed877();
     o.message = "foo";
   }
   buildCounterAddressesScopedListWarning--;
@@ -235,7 +235,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed826(o.data);
+    checkUnnamed877(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressesScopedListWarning--;
@@ -246,7 +246,7 @@
   var o = new api.AddressesScopedList();
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    o.addresses = buildUnnamed825();
+    o.addresses = buildUnnamed876();
     o.warning = buildAddressesScopedListWarning();
   }
   buildCounterAddressesScopedList--;
@@ -256,20 +256,20 @@
 checkAddressesScopedList(api.AddressesScopedList o) {
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    checkUnnamed825(o.addresses);
+    checkUnnamed876(o.addresses);
     checkAddressesScopedListWarning(o.warning);
   }
   buildCounterAddressesScopedList--;
 }
 
-buildUnnamed827() {
+buildUnnamed878() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed827(core.List<core.String> o) {
+checkUnnamed878(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -286,7 +286,7 @@
     o.index = 42;
     o.initializeParams = buildAttachedDiskInitializeParams();
     o.kind = "foo";
-    o.licenses = buildUnnamed827();
+    o.licenses = buildUnnamed878();
     o.mode = "foo";
     o.source = "foo";
     o.type = "foo";
@@ -304,7 +304,7 @@
     unittest.expect(o.index, unittest.equals(42));
     checkAttachedDiskInitializeParams(o.initializeParams);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed827(o.licenses);
+    checkUnnamed878(o.licenses);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -368,27 +368,27 @@
   buildCounterBackend--;
 }
 
-buildUnnamed828() {
+buildUnnamed879() {
   var o = new core.List<api.Backend>();
   o.add(buildBackend());
   o.add(buildBackend());
   return o;
 }
 
-checkUnnamed828(core.List<api.Backend> o) {
+checkUnnamed879(core.List<api.Backend> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackend(o[0]);
   checkBackend(o[1]);
 }
 
-buildUnnamed829() {
+buildUnnamed880() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed829(core.List<core.String> o) {
+checkUnnamed880(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -399,11 +399,11 @@
   var o = new api.BackendService();
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    o.backends = buildUnnamed828();
+    o.backends = buildUnnamed879();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.healthChecks = buildUnnamed829();
+    o.healthChecks = buildUnnamed880();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -420,11 +420,11 @@
 checkBackendService(api.BackendService o) {
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    checkUnnamed828(o.backends);
+    checkUnnamed879(o.backends);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed829(o.healthChecks);
+    checkUnnamed880(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -437,14 +437,14 @@
   buildCounterBackendService--;
 }
 
-buildUnnamed830() {
+buildUnnamed881() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed830(core.List<api.HealthStatus> o) {
+checkUnnamed881(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -455,7 +455,7 @@
   var o = new api.BackendServiceGroupHealth();
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    o.healthStatus = buildUnnamed830();
+    o.healthStatus = buildUnnamed881();
     o.kind = "foo";
   }
   buildCounterBackendServiceGroupHealth--;
@@ -465,20 +465,20 @@
 checkBackendServiceGroupHealth(api.BackendServiceGroupHealth o) {
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    checkUnnamed830(o.healthStatus);
+    checkUnnamed881(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBackendServiceGroupHealth--;
 }
 
-buildUnnamed831() {
+buildUnnamed882() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed831(core.List<api.BackendService> o) {
+checkUnnamed882(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -490,7 +490,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed831();
+    o.items = buildUnnamed882();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -503,7 +503,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed831(o.items);
+    checkUnnamed882(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -538,14 +538,14 @@
   buildCounterDeprecationStatus--;
 }
 
-buildUnnamed832() {
+buildUnnamed883() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed832(core.List<core.String> o) {
+checkUnnamed883(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -560,7 +560,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed832();
+    o.licenses = buildUnnamed883();
     o.name = "foo";
     o.options = "foo";
     o.selfLink = "foo";
@@ -584,7 +584,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed832(o.licenses);
+    checkUnnamed883(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.options, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -600,14 +600,14 @@
   buildCounterDisk--;
 }
 
-buildUnnamed833() {
+buildUnnamed884() {
   var o = new core.Map<core.String, api.DisksScopedList>();
   o["x"] = buildDisksScopedList();
   o["y"] = buildDisksScopedList();
   return o;
 }
 
-checkUnnamed833(core.Map<core.String, api.DisksScopedList> o) {
+checkUnnamed884(core.Map<core.String, api.DisksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedList(o["x"]);
   checkDisksScopedList(o["y"]);
@@ -619,7 +619,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed833();
+    o.items = buildUnnamed884();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -632,7 +632,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed833(o.items);
+    checkUnnamed884(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -640,14 +640,14 @@
   buildCounterDiskAggregatedList--;
 }
 
-buildUnnamed834() {
+buildUnnamed885() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed834(core.List<api.Disk> o) {
+checkUnnamed885(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -659,7 +659,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed834();
+    o.items = buildUnnamed885();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -672,7 +672,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed834(o.items);
+    checkUnnamed885(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -717,14 +717,14 @@
   buildCounterDiskType--;
 }
 
-buildUnnamed835() {
+buildUnnamed886() {
   var o = new core.Map<core.String, api.DiskTypesScopedList>();
   o["x"] = buildDiskTypesScopedList();
   o["y"] = buildDiskTypesScopedList();
   return o;
 }
 
-checkUnnamed835(core.Map<core.String, api.DiskTypesScopedList> o) {
+checkUnnamed886(core.Map<core.String, api.DiskTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedList(o["x"]);
   checkDiskTypesScopedList(o["y"]);
@@ -736,7 +736,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed835();
+    o.items = buildUnnamed886();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -749,7 +749,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed835(o.items);
+    checkUnnamed886(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -757,14 +757,14 @@
   buildCounterDiskTypeAggregatedList--;
 }
 
-buildUnnamed836() {
+buildUnnamed887() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed836(core.List<api.DiskType> o) {
+checkUnnamed887(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -776,7 +776,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed836();
+    o.items = buildUnnamed887();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -789,7 +789,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed836(o.items);
+    checkUnnamed887(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -797,14 +797,14 @@
   buildCounterDiskTypeList--;
 }
 
-buildUnnamed837() {
+buildUnnamed888() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed837(core.List<api.DiskType> o) {
+checkUnnamed888(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -831,14 +831,14 @@
   buildCounterDiskTypesScopedListWarningData--;
 }
 
-buildUnnamed838() {
+buildUnnamed889() {
   var o = new core.List<api.DiskTypesScopedListWarningData>();
   o.add(buildDiskTypesScopedListWarningData());
   o.add(buildDiskTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed838(core.List<api.DiskTypesScopedListWarningData> o) {
+checkUnnamed889(core.List<api.DiskTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedListWarningData(o[0]);
   checkDiskTypesScopedListWarningData(o[1]);
@@ -850,7 +850,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed838();
+    o.data = buildUnnamed889();
     o.message = "foo";
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -861,7 +861,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed838(o.data);
+    checkUnnamed889(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -872,7 +872,7 @@
   var o = new api.DiskTypesScopedList();
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    o.diskTypes = buildUnnamed837();
+    o.diskTypes = buildUnnamed888();
     o.warning = buildDiskTypesScopedListWarning();
   }
   buildCounterDiskTypesScopedList--;
@@ -882,20 +882,20 @@
 checkDiskTypesScopedList(api.DiskTypesScopedList o) {
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    checkUnnamed837(o.diskTypes);
+    checkUnnamed888(o.diskTypes);
     checkDiskTypesScopedListWarning(o.warning);
   }
   buildCounterDiskTypesScopedList--;
 }
 
-buildUnnamed839() {
+buildUnnamed890() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed839(core.List<api.Disk> o) {
+checkUnnamed890(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -922,14 +922,14 @@
   buildCounterDisksScopedListWarningData--;
 }
 
-buildUnnamed840() {
+buildUnnamed891() {
   var o = new core.List<api.DisksScopedListWarningData>();
   o.add(buildDisksScopedListWarningData());
   o.add(buildDisksScopedListWarningData());
   return o;
 }
 
-checkUnnamed840(core.List<api.DisksScopedListWarningData> o) {
+checkUnnamed891(core.List<api.DisksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedListWarningData(o[0]);
   checkDisksScopedListWarningData(o[1]);
@@ -941,7 +941,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed840();
+    o.data = buildUnnamed891();
     o.message = "foo";
   }
   buildCounterDisksScopedListWarning--;
@@ -952,7 +952,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed840(o.data);
+    checkUnnamed891(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDisksScopedListWarning--;
@@ -963,7 +963,7 @@
   var o = new api.DisksScopedList();
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    o.disks = buildUnnamed839();
+    o.disks = buildUnnamed890();
     o.warning = buildDisksScopedListWarning();
   }
   buildCounterDisksScopedList--;
@@ -973,20 +973,20 @@
 checkDisksScopedList(api.DisksScopedList o) {
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    checkUnnamed839(o.disks);
+    checkUnnamed890(o.disks);
     checkDisksScopedListWarning(o.warning);
   }
   buildCounterDisksScopedList--;
 }
 
-buildUnnamed841() {
+buildUnnamed892() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed841(core.List<core.String> o) {
+checkUnnamed892(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -998,7 +998,7 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed841();
+    o.ports = buildUnnamed892();
   }
   buildCounterFirewallAllowed--;
   return o;
@@ -1008,58 +1008,58 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed841(o.ports);
+    checkUnnamed892(o.ports);
   }
   buildCounterFirewallAllowed--;
 }
 
-buildUnnamed842() {
+buildUnnamed893() {
   var o = new core.List<api.FirewallAllowed>();
   o.add(buildFirewallAllowed());
   o.add(buildFirewallAllowed());
   return o;
 }
 
-checkUnnamed842(core.List<api.FirewallAllowed> o) {
+checkUnnamed893(core.List<api.FirewallAllowed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallAllowed(o[0]);
   checkFirewallAllowed(o[1]);
 }
 
-buildUnnamed843() {
+buildUnnamed894() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed843(core.List<core.String> o) {
+checkUnnamed894(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed844() {
+buildUnnamed895() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed844(core.List<core.String> o) {
+checkUnnamed895(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed845() {
+buildUnnamed896() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed845(core.List<core.String> o) {
+checkUnnamed896(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1070,7 +1070,7 @@
   var o = new api.Firewall();
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    o.allowed = buildUnnamed842();
+    o.allowed = buildUnnamed893();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.id = "foo";
@@ -1078,9 +1078,9 @@
     o.name = "foo";
     o.network = "foo";
     o.selfLink = "foo";
-    o.sourceRanges = buildUnnamed843();
-    o.sourceTags = buildUnnamed844();
-    o.targetTags = buildUnnamed845();
+    o.sourceRanges = buildUnnamed894();
+    o.sourceTags = buildUnnamed895();
+    o.targetTags = buildUnnamed896();
   }
   buildCounterFirewall--;
   return o;
@@ -1089,7 +1089,7 @@
 checkFirewall(api.Firewall o) {
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    checkUnnamed842(o.allowed);
+    checkUnnamed893(o.allowed);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1097,21 +1097,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed843(o.sourceRanges);
-    checkUnnamed844(o.sourceTags);
-    checkUnnamed845(o.targetTags);
+    checkUnnamed894(o.sourceRanges);
+    checkUnnamed895(o.sourceTags);
+    checkUnnamed896(o.targetTags);
   }
   buildCounterFirewall--;
 }
 
-buildUnnamed846() {
+buildUnnamed897() {
   var o = new core.List<api.Firewall>();
   o.add(buildFirewall());
   o.add(buildFirewall());
   return o;
 }
 
-checkUnnamed846(core.List<api.Firewall> o) {
+checkUnnamed897(core.List<api.Firewall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewall(o[0]);
   checkFirewall(o[1]);
@@ -1123,7 +1123,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed846();
+    o.items = buildUnnamed897();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1136,7 +1136,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed846(o.items);
+    checkUnnamed897(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1183,14 +1183,14 @@
   buildCounterForwardingRule--;
 }
 
-buildUnnamed847() {
+buildUnnamed898() {
   var o = new core.Map<core.String, api.ForwardingRulesScopedList>();
   o["x"] = buildForwardingRulesScopedList();
   o["y"] = buildForwardingRulesScopedList();
   return o;
 }
 
-checkUnnamed847(core.Map<core.String, api.ForwardingRulesScopedList> o) {
+checkUnnamed898(core.Map<core.String, api.ForwardingRulesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedList(o["x"]);
   checkForwardingRulesScopedList(o["y"]);
@@ -1202,7 +1202,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed847();
+    o.items = buildUnnamed898();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1215,7 +1215,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed847(o.items);
+    checkUnnamed898(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1223,14 +1223,14 @@
   buildCounterForwardingRuleAggregatedList--;
 }
 
-buildUnnamed848() {
+buildUnnamed899() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed848(core.List<api.ForwardingRule> o) {
+checkUnnamed899(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1242,7 +1242,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed848();
+    o.items = buildUnnamed899();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1255,7 +1255,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed848(o.items);
+    checkUnnamed899(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1263,14 +1263,14 @@
   buildCounterForwardingRuleList--;
 }
 
-buildUnnamed849() {
+buildUnnamed900() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed849(core.List<api.ForwardingRule> o) {
+checkUnnamed900(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1297,14 +1297,14 @@
   buildCounterForwardingRulesScopedListWarningData--;
 }
 
-buildUnnamed850() {
+buildUnnamed901() {
   var o = new core.List<api.ForwardingRulesScopedListWarningData>();
   o.add(buildForwardingRulesScopedListWarningData());
   o.add(buildForwardingRulesScopedListWarningData());
   return o;
 }
 
-checkUnnamed850(core.List<api.ForwardingRulesScopedListWarningData> o) {
+checkUnnamed901(core.List<api.ForwardingRulesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedListWarningData(o[0]);
   checkForwardingRulesScopedListWarningData(o[1]);
@@ -1316,7 +1316,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed850();
+    o.data = buildUnnamed901();
     o.message = "foo";
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1327,7 +1327,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed850(o.data);
+    checkUnnamed901(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1338,7 +1338,7 @@
   var o = new api.ForwardingRulesScopedList();
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    o.forwardingRules = buildUnnamed849();
+    o.forwardingRules = buildUnnamed900();
     o.warning = buildForwardingRulesScopedListWarning();
   }
   buildCounterForwardingRulesScopedList--;
@@ -1348,7 +1348,7 @@
 checkForwardingRulesScopedList(api.ForwardingRulesScopedList o) {
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    checkUnnamed849(o.forwardingRules);
+    checkUnnamed900(o.forwardingRules);
     checkForwardingRulesScopedListWarning(o.warning);
   }
   buildCounterForwardingRulesScopedList--;
@@ -1398,14 +1398,14 @@
   buildCounterHealthStatus--;
 }
 
-buildUnnamed851() {
+buildUnnamed902() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed851(core.List<core.String> o) {
+checkUnnamed902(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1417,7 +1417,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     o.description = "foo";
-    o.hosts = buildUnnamed851();
+    o.hosts = buildUnnamed902();
     o.pathMatcher = "foo";
   }
   buildCounterHostRule--;
@@ -1428,7 +1428,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed851(o.hosts);
+    checkUnnamed902(o.hosts);
     unittest.expect(o.pathMatcher, unittest.equals('foo'));
   }
   buildCounterHostRule--;
@@ -1477,14 +1477,14 @@
   buildCounterHttpHealthCheck--;
 }
 
-buildUnnamed852() {
+buildUnnamed903() {
   var o = new core.List<api.HttpHealthCheck>();
   o.add(buildHttpHealthCheck());
   o.add(buildHttpHealthCheck());
   return o;
 }
 
-checkUnnamed852(core.List<api.HttpHealthCheck> o) {
+checkUnnamed903(core.List<api.HttpHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpHealthCheck(o[0]);
   checkHttpHealthCheck(o[1]);
@@ -1496,7 +1496,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed852();
+    o.items = buildUnnamed903();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1509,7 +1509,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed852(o.items);
+    checkUnnamed903(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1517,14 +1517,14 @@
   buildCounterHttpHealthCheckList--;
 }
 
-buildUnnamed853() {
+buildUnnamed904() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed853(core.List<core.String> o) {
+checkUnnamed904(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1565,7 +1565,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed853();
+    o.licenses = buildUnnamed904();
     o.name = "foo";
     o.rawDisk = buildImageRawDisk();
     o.selfLink = "foo";
@@ -1588,7 +1588,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed853(o.licenses);
+    checkUnnamed904(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     checkImageRawDisk(o.rawDisk);
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1600,14 +1600,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed854() {
+buildUnnamed905() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed854(core.List<api.Image> o) {
+checkUnnamed905(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -1619,7 +1619,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed854();
+    o.items = buildUnnamed905();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1632,7 +1632,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed854(o.items);
+    checkUnnamed905(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1640,40 +1640,40 @@
   buildCounterImageList--;
 }
 
-buildUnnamed855() {
+buildUnnamed906() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed855(core.List<api.AttachedDisk> o) {
+checkUnnamed906(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed856() {
+buildUnnamed907() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed856(core.List<api.NetworkInterface> o) {
+checkUnnamed907(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed857() {
+buildUnnamed908() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed857(core.List<api.ServiceAccount> o) {
+checkUnnamed908(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -1687,16 +1687,16 @@
     o.canIpForward = true;
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.disks = buildUnnamed855();
+    o.disks = buildUnnamed906();
     o.id = "foo";
     o.kind = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
     o.name = "foo";
-    o.networkInterfaces = buildUnnamed856();
+    o.networkInterfaces = buildUnnamed907();
     o.scheduling = buildScheduling();
     o.selfLink = "foo";
-    o.serviceAccounts = buildUnnamed857();
+    o.serviceAccounts = buildUnnamed908();
     o.status = "foo";
     o.statusMessage = "foo";
     o.tags = buildTags();
@@ -1712,16 +1712,16 @@
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed855(o.disks);
+    checkUnnamed906(o.disks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed856(o.networkInterfaces);
+    checkUnnamed907(o.networkInterfaces);
     checkScheduling(o.scheduling);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed857(o.serviceAccounts);
+    checkUnnamed908(o.serviceAccounts);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
     checkTags(o.tags);
@@ -1730,14 +1730,14 @@
   buildCounterInstance--;
 }
 
-buildUnnamed858() {
+buildUnnamed909() {
   var o = new core.Map<core.String, api.InstancesScopedList>();
   o["x"] = buildInstancesScopedList();
   o["y"] = buildInstancesScopedList();
   return o;
 }
 
-checkUnnamed858(core.Map<core.String, api.InstancesScopedList> o) {
+checkUnnamed909(core.Map<core.String, api.InstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedList(o["x"]);
   checkInstancesScopedList(o["y"]);
@@ -1749,7 +1749,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed858();
+    o.items = buildUnnamed909();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1762,7 +1762,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed858(o.items);
+    checkUnnamed909(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1770,14 +1770,14 @@
   buildCounterInstanceAggregatedList--;
 }
 
-buildUnnamed859() {
+buildUnnamed910() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed859(core.List<api.Instance> o) {
+checkUnnamed910(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -1789,7 +1789,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed859();
+    o.items = buildUnnamed910();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1802,7 +1802,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed859(o.items);
+    checkUnnamed910(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1810,40 +1810,40 @@
   buildCounterInstanceList--;
 }
 
-buildUnnamed860() {
+buildUnnamed911() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed860(core.List<api.AttachedDisk> o) {
+checkUnnamed911(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed861() {
+buildUnnamed912() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed861(core.List<api.NetworkInterface> o) {
+checkUnnamed912(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed862() {
+buildUnnamed913() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed862(core.List<api.ServiceAccount> o) {
+checkUnnamed913(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -1856,12 +1856,12 @@
   if (buildCounterInstanceProperties < 3) {
     o.canIpForward = true;
     o.description = "foo";
-    o.disks = buildUnnamed860();
+    o.disks = buildUnnamed911();
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed861();
+    o.networkInterfaces = buildUnnamed912();
     o.scheduling = buildScheduling();
-    o.serviceAccounts = buildUnnamed862();
+    o.serviceAccounts = buildUnnamed913();
     o.tags = buildTags();
   }
   buildCounterInstanceProperties--;
@@ -1873,12 +1873,12 @@
   if (buildCounterInstanceProperties < 3) {
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed860(o.disks);
+    checkUnnamed911(o.disks);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed861(o.networkInterfaces);
+    checkUnnamed912(o.networkInterfaces);
     checkScheduling(o.scheduling);
-    checkUnnamed862(o.serviceAccounts);
+    checkUnnamed913(o.serviceAccounts);
     checkTags(o.tags);
   }
   buildCounterInstanceProperties--;
@@ -1934,14 +1934,14 @@
   buildCounterInstanceTemplate--;
 }
 
-buildUnnamed863() {
+buildUnnamed914() {
   var o = new core.List<api.InstanceTemplate>();
   o.add(buildInstanceTemplate());
   o.add(buildInstanceTemplate());
   return o;
 }
 
-checkUnnamed863(core.List<api.InstanceTemplate> o) {
+checkUnnamed914(core.List<api.InstanceTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceTemplate(o[0]);
   checkInstanceTemplate(o[1]);
@@ -1953,7 +1953,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed863();
+    o.items = buildUnnamed914();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1966,7 +1966,7 @@
   buildCounterInstanceTemplateList++;
   if (buildCounterInstanceTemplateList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed863(o.items);
+    checkUnnamed914(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1974,14 +1974,14 @@
   buildCounterInstanceTemplateList--;
 }
 
-buildUnnamed864() {
+buildUnnamed915() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed864(core.List<api.Instance> o) {
+checkUnnamed915(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -2008,14 +2008,14 @@
   buildCounterInstancesScopedListWarningData--;
 }
 
-buildUnnamed865() {
+buildUnnamed916() {
   var o = new core.List<api.InstancesScopedListWarningData>();
   o.add(buildInstancesScopedListWarningData());
   o.add(buildInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed865(core.List<api.InstancesScopedListWarningData> o) {
+checkUnnamed916(core.List<api.InstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedListWarningData(o[0]);
   checkInstancesScopedListWarningData(o[1]);
@@ -2027,7 +2027,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed865();
+    o.data = buildUnnamed916();
     o.message = "foo";
   }
   buildCounterInstancesScopedListWarning--;
@@ -2038,7 +2038,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed865(o.data);
+    checkUnnamed916(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstancesScopedListWarning--;
@@ -2049,7 +2049,7 @@
   var o = new api.InstancesScopedList();
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    o.instances = buildUnnamed864();
+    o.instances = buildUnnamed915();
     o.warning = buildInstancesScopedListWarning();
   }
   buildCounterInstancesScopedList--;
@@ -2059,7 +2059,7 @@
 checkInstancesScopedList(api.InstancesScopedList o) {
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    checkUnnamed864(o.instances);
+    checkUnnamed915(o.instances);
     checkInstancesScopedListWarning(o.warning);
   }
   buildCounterInstancesScopedList--;
@@ -2109,14 +2109,14 @@
   buildCounterMachineTypeScratchDisks--;
 }
 
-buildUnnamed866() {
+buildUnnamed917() {
   var o = new core.List<api.MachineTypeScratchDisks>();
   o.add(buildMachineTypeScratchDisks());
   o.add(buildMachineTypeScratchDisks());
   return o;
 }
 
-checkUnnamed866(core.List<api.MachineTypeScratchDisks> o) {
+checkUnnamed917(core.List<api.MachineTypeScratchDisks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeScratchDisks(o[0]);
   checkMachineTypeScratchDisks(o[1]);
@@ -2138,7 +2138,7 @@
     o.maximumPersistentDisksSizeGb = "foo";
     o.memoryMb = 42;
     o.name = "foo";
-    o.scratchDisks = buildUnnamed866();
+    o.scratchDisks = buildUnnamed917();
     o.selfLink = "foo";
     o.zone = "foo";
   }
@@ -2160,21 +2160,21 @@
     unittest.expect(o.maximumPersistentDisksSizeGb, unittest.equals('foo'));
     unittest.expect(o.memoryMb, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed866(o.scratchDisks);
+    checkUnnamed917(o.scratchDisks);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterMachineType--;
 }
 
-buildUnnamed867() {
+buildUnnamed918() {
   var o = new core.Map<core.String, api.MachineTypesScopedList>();
   o["x"] = buildMachineTypesScopedList();
   o["y"] = buildMachineTypesScopedList();
   return o;
 }
 
-checkUnnamed867(core.Map<core.String, api.MachineTypesScopedList> o) {
+checkUnnamed918(core.Map<core.String, api.MachineTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedList(o["x"]);
   checkMachineTypesScopedList(o["y"]);
@@ -2186,7 +2186,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed867();
+    o.items = buildUnnamed918();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2199,7 +2199,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed867(o.items);
+    checkUnnamed918(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2207,14 +2207,14 @@
   buildCounterMachineTypeAggregatedList--;
 }
 
-buildUnnamed868() {
+buildUnnamed919() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed868(core.List<api.MachineType> o) {
+checkUnnamed919(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2226,7 +2226,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed868();
+    o.items = buildUnnamed919();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2239,7 +2239,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed868(o.items);
+    checkUnnamed919(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2247,14 +2247,14 @@
   buildCounterMachineTypeList--;
 }
 
-buildUnnamed869() {
+buildUnnamed920() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed869(core.List<api.MachineType> o) {
+checkUnnamed920(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2281,14 +2281,14 @@
   buildCounterMachineTypesScopedListWarningData--;
 }
 
-buildUnnamed870() {
+buildUnnamed921() {
   var o = new core.List<api.MachineTypesScopedListWarningData>();
   o.add(buildMachineTypesScopedListWarningData());
   o.add(buildMachineTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed870(core.List<api.MachineTypesScopedListWarningData> o) {
+checkUnnamed921(core.List<api.MachineTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedListWarningData(o[0]);
   checkMachineTypesScopedListWarningData(o[1]);
@@ -2300,7 +2300,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed870();
+    o.data = buildUnnamed921();
     o.message = "foo";
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2311,7 +2311,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed870(o.data);
+    checkUnnamed921(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2322,7 +2322,7 @@
   var o = new api.MachineTypesScopedList();
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    o.machineTypes = buildUnnamed869();
+    o.machineTypes = buildUnnamed920();
     o.warning = buildMachineTypesScopedListWarning();
   }
   buildCounterMachineTypesScopedList--;
@@ -2332,7 +2332,7 @@
 checkMachineTypesScopedList(api.MachineTypesScopedList o) {
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    checkUnnamed869(o.machineTypes);
+    checkUnnamed920(o.machineTypes);
     checkMachineTypesScopedListWarning(o.warning);
   }
   buildCounterMachineTypesScopedList--;
@@ -2359,14 +2359,14 @@
   buildCounterMetadataItems--;
 }
 
-buildUnnamed871() {
+buildUnnamed922() {
   var o = new core.List<api.MetadataItems>();
   o.add(buildMetadataItems());
   o.add(buildMetadataItems());
   return o;
 }
 
-checkUnnamed871(core.List<api.MetadataItems> o) {
+checkUnnamed922(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItems(o[0]);
   checkMetadataItems(o[1]);
@@ -2378,7 +2378,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed871();
+    o.items = buildUnnamed922();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -2389,7 +2389,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed871(o.items);
+    checkUnnamed922(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -2428,14 +2428,14 @@
   buildCounterNetwork--;
 }
 
-buildUnnamed872() {
+buildUnnamed923() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed872(core.List<api.AccessConfig> o) {
+checkUnnamed923(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -2446,7 +2446,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed872();
+    o.accessConfigs = buildUnnamed923();
     o.name = "foo";
     o.network = "foo";
     o.networkIP = "foo";
@@ -2458,7 +2458,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed872(o.accessConfigs);
+    checkUnnamed923(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIP, unittest.equals('foo'));
@@ -2466,14 +2466,14 @@
   buildCounterNetworkInterface--;
 }
 
-buildUnnamed873() {
+buildUnnamed924() {
   var o = new core.List<api.Network>();
   o.add(buildNetwork());
   o.add(buildNetwork());
   return o;
 }
 
-checkUnnamed873(core.List<api.Network> o) {
+checkUnnamed924(core.List<api.Network> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetwork(o[0]);
   checkNetwork(o[1]);
@@ -2485,7 +2485,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed873();
+    o.items = buildUnnamed924();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2498,7 +2498,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed873(o.items);
+    checkUnnamed924(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2529,14 +2529,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed874() {
+buildUnnamed925() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed874(core.List<api.OperationErrorErrors> o) {
+checkUnnamed925(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -2547,7 +2547,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed874();
+    o.errors = buildUnnamed925();
   }
   buildCounterOperationError--;
   return o;
@@ -2556,7 +2556,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed874(o.errors);
+    checkUnnamed925(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -2582,14 +2582,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed875() {
+buildUnnamed926() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed875(core.List<api.OperationWarningsData> o) {
+checkUnnamed926(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -2601,7 +2601,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed875();
+    o.data = buildUnnamed926();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -2612,20 +2612,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed875(o.data);
+    checkUnnamed926(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed876() {
+buildUnnamed927() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed876(core.List<api.OperationWarnings> o) {
+checkUnnamed927(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -2656,7 +2656,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed876();
+    o.warnings = buildUnnamed927();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -2686,20 +2686,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed876(o.warnings);
+    checkUnnamed927(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed877() {
+buildUnnamed928() {
   var o = new core.Map<core.String, api.OperationsScopedList>();
   o["x"] = buildOperationsScopedList();
   o["y"] = buildOperationsScopedList();
   return o;
 }
 
-checkUnnamed877(core.Map<core.String, api.OperationsScopedList> o) {
+checkUnnamed928(core.Map<core.String, api.OperationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedList(o["x"]);
   checkOperationsScopedList(o["y"]);
@@ -2711,7 +2711,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed877();
+    o.items = buildUnnamed928();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2724,7 +2724,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed877(o.items);
+    checkUnnamed928(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2732,14 +2732,14 @@
   buildCounterOperationAggregatedList--;
 }
 
-buildUnnamed878() {
+buildUnnamed929() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed878(core.List<api.Operation> o) {
+checkUnnamed929(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2751,7 +2751,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed878();
+    o.items = buildUnnamed929();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2764,7 +2764,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed878(o.items);
+    checkUnnamed929(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2772,14 +2772,14 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed879() {
+buildUnnamed930() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed879(core.List<api.Operation> o) {
+checkUnnamed930(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2806,14 +2806,14 @@
   buildCounterOperationsScopedListWarningData--;
 }
 
-buildUnnamed880() {
+buildUnnamed931() {
   var o = new core.List<api.OperationsScopedListWarningData>();
   o.add(buildOperationsScopedListWarningData());
   o.add(buildOperationsScopedListWarningData());
   return o;
 }
 
-checkUnnamed880(core.List<api.OperationsScopedListWarningData> o) {
+checkUnnamed931(core.List<api.OperationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedListWarningData(o[0]);
   checkOperationsScopedListWarningData(o[1]);
@@ -2825,7 +2825,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed880();
+    o.data = buildUnnamed931();
     o.message = "foo";
   }
   buildCounterOperationsScopedListWarning--;
@@ -2836,7 +2836,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed880(o.data);
+    checkUnnamed931(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationsScopedListWarning--;
@@ -2847,7 +2847,7 @@
   var o = new api.OperationsScopedList();
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    o.operations = buildUnnamed879();
+    o.operations = buildUnnamed930();
     o.warning = buildOperationsScopedListWarning();
   }
   buildCounterOperationsScopedList--;
@@ -2857,20 +2857,20 @@
 checkOperationsScopedList(api.OperationsScopedList o) {
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    checkUnnamed879(o.operations);
+    checkUnnamed930(o.operations);
     checkOperationsScopedListWarning(o.warning);
   }
   buildCounterOperationsScopedList--;
 }
 
-buildUnnamed881() {
+buildUnnamed932() {
   var o = new core.List<api.PathRule>();
   o.add(buildPathRule());
   o.add(buildPathRule());
   return o;
 }
 
-checkUnnamed881(core.List<api.PathRule> o) {
+checkUnnamed932(core.List<api.PathRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathRule(o[0]);
   checkPathRule(o[1]);
@@ -2884,7 +2884,7 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.name = "foo";
-    o.pathRules = buildUnnamed881();
+    o.pathRules = buildUnnamed932();
   }
   buildCounterPathMatcher--;
   return o;
@@ -2896,19 +2896,19 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed881(o.pathRules);
+    checkUnnamed932(o.pathRules);
   }
   buildCounterPathMatcher--;
 }
 
-buildUnnamed882() {
+buildUnnamed933() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed882(core.List<core.String> o) {
+checkUnnamed933(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2919,7 +2919,7 @@
   var o = new api.PathRule();
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    o.paths = buildUnnamed882();
+    o.paths = buildUnnamed933();
     o.service = "foo";
   }
   buildCounterPathRule--;
@@ -2929,20 +2929,20 @@
 checkPathRule(api.PathRule o) {
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    checkUnnamed882(o.paths);
+    checkUnnamed933(o.paths);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterPathRule--;
 }
 
-buildUnnamed883() {
+buildUnnamed934() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed883(core.List<api.Quota> o) {
+checkUnnamed934(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
@@ -2959,7 +2959,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed883();
+    o.quotas = buildUnnamed934();
     o.selfLink = "foo";
     o.usageExportLocation = buildUsageExportLocation();
   }
@@ -2976,7 +2976,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed883(o.quotas);
+    checkUnnamed934(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUsageExportLocation(o.usageExportLocation);
   }
@@ -3006,27 +3006,27 @@
   buildCounterQuota--;
 }
 
-buildUnnamed884() {
+buildUnnamed935() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed884(core.List<api.Quota> o) {
+checkUnnamed935(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
 }
 
-buildUnnamed885() {
+buildUnnamed936() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed885(core.List<core.String> o) {
+checkUnnamed936(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3043,10 +3043,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed884();
+    o.quotas = buildUnnamed935();
     o.selfLink = "foo";
     o.status = "foo";
-    o.zones = buildUnnamed885();
+    o.zones = buildUnnamed936();
   }
   buildCounterRegion--;
   return o;
@@ -3061,22 +3061,22 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed884(o.quotas);
+    checkUnnamed935(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed885(o.zones);
+    checkUnnamed936(o.zones);
   }
   buildCounterRegion--;
 }
 
-buildUnnamed886() {
+buildUnnamed937() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed886(core.List<api.Region> o) {
+checkUnnamed937(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -3088,7 +3088,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed886();
+    o.items = buildUnnamed937();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3101,7 +3101,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed886(o.items);
+    checkUnnamed937(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3128,14 +3128,14 @@
   buildCounterResourceGroupReference--;
 }
 
-buildUnnamed887() {
+buildUnnamed938() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed887(core.List<core.String> o) {
+checkUnnamed938(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3162,14 +3162,14 @@
   buildCounterRouteWarningsData--;
 }
 
-buildUnnamed888() {
+buildUnnamed939() {
   var o = new core.List<api.RouteWarningsData>();
   o.add(buildRouteWarningsData());
   o.add(buildRouteWarningsData());
   return o;
 }
 
-checkUnnamed888(core.List<api.RouteWarningsData> o) {
+checkUnnamed939(core.List<api.RouteWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarningsData(o[0]);
   checkRouteWarningsData(o[1]);
@@ -3181,7 +3181,7 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed888();
+    o.data = buildUnnamed939();
     o.message = "foo";
   }
   buildCounterRouteWarnings--;
@@ -3192,20 +3192,20 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed888(o.data);
+    checkUnnamed939(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouteWarnings--;
 }
 
-buildUnnamed889() {
+buildUnnamed940() {
   var o = new core.List<api.RouteWarnings>();
   o.add(buildRouteWarnings());
   o.add(buildRouteWarnings());
   return o;
 }
 
-checkUnnamed889(core.List<api.RouteWarnings> o) {
+checkUnnamed940(core.List<api.RouteWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarnings(o[0]);
   checkRouteWarnings(o[1]);
@@ -3229,8 +3229,8 @@
     o.nextHopNetwork = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.tags = buildUnnamed887();
-    o.warnings = buildUnnamed889();
+    o.tags = buildUnnamed938();
+    o.warnings = buildUnnamed940();
   }
   buildCounterRoute--;
   return o;
@@ -3252,20 +3252,20 @@
     unittest.expect(o.nextHopNetwork, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed887(o.tags);
-    checkUnnamed889(o.warnings);
+    checkUnnamed938(o.tags);
+    checkUnnamed940(o.warnings);
   }
   buildCounterRoute--;
 }
 
-buildUnnamed890() {
+buildUnnamed941() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed890(core.List<api.Route> o) {
+checkUnnamed941(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -3277,7 +3277,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed890();
+    o.items = buildUnnamed941();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3290,7 +3290,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed890(o.items);
+    checkUnnamed941(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3342,14 +3342,14 @@
   buildCounterSerialPortOutput--;
 }
 
-buildUnnamed891() {
+buildUnnamed942() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed891(core.List<core.String> o) {
+checkUnnamed942(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3361,7 +3361,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed891();
+    o.scopes = buildUnnamed942();
   }
   buildCounterServiceAccount--;
   return o;
@@ -3371,19 +3371,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed891(o.scopes);
+    checkUnnamed942(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed892() {
+buildUnnamed943() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed892(core.List<core.String> o) {
+checkUnnamed943(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3399,7 +3399,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed892();
+    o.licenses = buildUnnamed943();
     o.name = "foo";
     o.selfLink = "foo";
     o.sourceDisk = "foo";
@@ -3420,7 +3420,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed892(o.licenses);
+    checkUnnamed943(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceDisk, unittest.equals('foo'));
@@ -3432,14 +3432,14 @@
   buildCounterSnapshot--;
 }
 
-buildUnnamed893() {
+buildUnnamed944() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed893(core.List<api.Snapshot> o) {
+checkUnnamed944(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -3451,7 +3451,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed893();
+    o.items = buildUnnamed944();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3464,7 +3464,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed893(o.items);
+    checkUnnamed944(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3472,14 +3472,14 @@
   buildCounterSnapshotList--;
 }
 
-buildUnnamed894() {
+buildUnnamed945() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed894(core.List<core.String> o) {
+checkUnnamed945(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3491,7 +3491,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed894();
+    o.items = buildUnnamed945();
   }
   buildCounterTags--;
   return o;
@@ -3501,7 +3501,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed894(o.items);
+    checkUnnamed945(o.items);
   }
   buildCounterTags--;
 }
@@ -3537,14 +3537,14 @@
   buildCounterTargetHttpProxy--;
 }
 
-buildUnnamed895() {
+buildUnnamed946() {
   var o = new core.List<api.TargetHttpProxy>();
   o.add(buildTargetHttpProxy());
   o.add(buildTargetHttpProxy());
   return o;
 }
 
-checkUnnamed895(core.List<api.TargetHttpProxy> o) {
+checkUnnamed946(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpProxy(o[0]);
   checkTargetHttpProxy(o[1]);
@@ -3556,7 +3556,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed895();
+    o.items = buildUnnamed946();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3569,7 +3569,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed895(o.items);
+    checkUnnamed946(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3612,14 +3612,14 @@
   buildCounterTargetInstance--;
 }
 
-buildUnnamed896() {
+buildUnnamed947() {
   var o = new core.Map<core.String, api.TargetInstancesScopedList>();
   o["x"] = buildTargetInstancesScopedList();
   o["y"] = buildTargetInstancesScopedList();
   return o;
 }
 
-checkUnnamed896(core.Map<core.String, api.TargetInstancesScopedList> o) {
+checkUnnamed947(core.Map<core.String, api.TargetInstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedList(o["x"]);
   checkTargetInstancesScopedList(o["y"]);
@@ -3631,7 +3631,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed896();
+    o.items = buildUnnamed947();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3644,7 +3644,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed896(o.items);
+    checkUnnamed947(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3652,14 +3652,14 @@
   buildCounterTargetInstanceAggregatedList--;
 }
 
-buildUnnamed897() {
+buildUnnamed948() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed897(core.List<api.TargetInstance> o) {
+checkUnnamed948(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3671,7 +3671,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed897();
+    o.items = buildUnnamed948();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3684,7 +3684,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed897(o.items);
+    checkUnnamed948(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3692,14 +3692,14 @@
   buildCounterTargetInstanceList--;
 }
 
-buildUnnamed898() {
+buildUnnamed949() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed898(core.List<api.TargetInstance> o) {
+checkUnnamed949(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3726,14 +3726,14 @@
   buildCounterTargetInstancesScopedListWarningData--;
 }
 
-buildUnnamed899() {
+buildUnnamed950() {
   var o = new core.List<api.TargetInstancesScopedListWarningData>();
   o.add(buildTargetInstancesScopedListWarningData());
   o.add(buildTargetInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed899(core.List<api.TargetInstancesScopedListWarningData> o) {
+checkUnnamed950(core.List<api.TargetInstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedListWarningData(o[0]);
   checkTargetInstancesScopedListWarningData(o[1]);
@@ -3745,7 +3745,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed899();
+    o.data = buildUnnamed950();
     o.message = "foo";
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3756,7 +3756,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed899(o.data);
+    checkUnnamed950(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3767,7 +3767,7 @@
   var o = new api.TargetInstancesScopedList();
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    o.targetInstances = buildUnnamed898();
+    o.targetInstances = buildUnnamed949();
     o.warning = buildTargetInstancesScopedListWarning();
   }
   buildCounterTargetInstancesScopedList--;
@@ -3777,33 +3777,33 @@
 checkTargetInstancesScopedList(api.TargetInstancesScopedList o) {
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    checkUnnamed898(o.targetInstances);
+    checkUnnamed949(o.targetInstances);
     checkTargetInstancesScopedListWarning(o.warning);
   }
   buildCounterTargetInstancesScopedList--;
 }
 
-buildUnnamed900() {
+buildUnnamed951() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed900(core.List<core.String> o) {
+checkUnnamed951(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed901() {
+buildUnnamed952() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed901(core.List<core.String> o) {
+checkUnnamed952(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3818,9 +3818,9 @@
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.failoverRatio = 42.0;
-    o.healthChecks = buildUnnamed900();
+    o.healthChecks = buildUnnamed951();
     o.id = "foo";
-    o.instances = buildUnnamed901();
+    o.instances = buildUnnamed952();
     o.kind = "foo";
     o.name = "foo";
     o.region = "foo";
@@ -3838,9 +3838,9 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.failoverRatio, unittest.equals(42.0));
-    checkUnnamed900(o.healthChecks);
+    checkUnnamed951(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed901(o.instances);
+    checkUnnamed952(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -3850,14 +3850,14 @@
   buildCounterTargetPool--;
 }
 
-buildUnnamed902() {
+buildUnnamed953() {
   var o = new core.Map<core.String, api.TargetPoolsScopedList>();
   o["x"] = buildTargetPoolsScopedList();
   o["y"] = buildTargetPoolsScopedList();
   return o;
 }
 
-checkUnnamed902(core.Map<core.String, api.TargetPoolsScopedList> o) {
+checkUnnamed953(core.Map<core.String, api.TargetPoolsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedList(o["x"]);
   checkTargetPoolsScopedList(o["y"]);
@@ -3869,7 +3869,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed902();
+    o.items = buildUnnamed953();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3882,7 +3882,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed902(o.items);
+    checkUnnamed953(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3890,14 +3890,14 @@
   buildCounterTargetPoolAggregatedList--;
 }
 
-buildUnnamed903() {
+buildUnnamed954() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed903(core.List<api.HealthStatus> o) {
+checkUnnamed954(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -3908,7 +3908,7 @@
   var o = new api.TargetPoolInstanceHealth();
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    o.healthStatus = buildUnnamed903();
+    o.healthStatus = buildUnnamed954();
     o.kind = "foo";
   }
   buildCounterTargetPoolInstanceHealth--;
@@ -3918,20 +3918,20 @@
 checkTargetPoolInstanceHealth(api.TargetPoolInstanceHealth o) {
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    checkUnnamed903(o.healthStatus);
+    checkUnnamed954(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTargetPoolInstanceHealth--;
 }
 
-buildUnnamed904() {
+buildUnnamed955() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed904(core.List<api.TargetPool> o) {
+checkUnnamed955(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -3943,7 +3943,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed904();
+    o.items = buildUnnamed955();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3956,7 +3956,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed904(o.items);
+    checkUnnamed955(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3964,14 +3964,14 @@
   buildCounterTargetPoolList--;
 }
 
-buildUnnamed905() {
+buildUnnamed956() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed905(core.List<api.HealthCheckReference> o) {
+checkUnnamed956(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -3982,7 +3982,7 @@
   var o = new api.TargetPoolsAddHealthCheckRequest();
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed905();
+    o.healthChecks = buildUnnamed956();
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
   return o;
@@ -3991,19 +3991,19 @@
 checkTargetPoolsAddHealthCheckRequest(api.TargetPoolsAddHealthCheckRequest o) {
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    checkUnnamed905(o.healthChecks);
+    checkUnnamed956(o.healthChecks);
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
 }
 
-buildUnnamed906() {
+buildUnnamed957() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed906(core.List<api.InstanceReference> o) {
+checkUnnamed957(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4014,7 +4014,7 @@
   var o = new api.TargetPoolsAddInstanceRequest();
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    o.instances = buildUnnamed906();
+    o.instances = buildUnnamed957();
   }
   buildCounterTargetPoolsAddInstanceRequest--;
   return o;
@@ -4023,19 +4023,19 @@
 checkTargetPoolsAddInstanceRequest(api.TargetPoolsAddInstanceRequest o) {
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    checkUnnamed906(o.instances);
+    checkUnnamed957(o.instances);
   }
   buildCounterTargetPoolsAddInstanceRequest--;
 }
 
-buildUnnamed907() {
+buildUnnamed958() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed907(core.List<api.HealthCheckReference> o) {
+checkUnnamed958(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -4046,7 +4046,7 @@
   var o = new api.TargetPoolsRemoveHealthCheckRequest();
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed907();
+    o.healthChecks = buildUnnamed958();
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
   return o;
@@ -4055,19 +4055,19 @@
 checkTargetPoolsRemoveHealthCheckRequest(api.TargetPoolsRemoveHealthCheckRequest o) {
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    checkUnnamed907(o.healthChecks);
+    checkUnnamed958(o.healthChecks);
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
 }
 
-buildUnnamed908() {
+buildUnnamed959() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed908(core.List<api.InstanceReference> o) {
+checkUnnamed959(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -4078,7 +4078,7 @@
   var o = new api.TargetPoolsRemoveInstanceRequest();
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    o.instances = buildUnnamed908();
+    o.instances = buildUnnamed959();
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
   return o;
@@ -4087,19 +4087,19 @@
 checkTargetPoolsRemoveInstanceRequest(api.TargetPoolsRemoveInstanceRequest o) {
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    checkUnnamed908(o.instances);
+    checkUnnamed959(o.instances);
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
 }
 
-buildUnnamed909() {
+buildUnnamed960() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed909(core.List<api.TargetPool> o) {
+checkUnnamed960(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -4126,14 +4126,14 @@
   buildCounterTargetPoolsScopedListWarningData--;
 }
 
-buildUnnamed910() {
+buildUnnamed961() {
   var o = new core.List<api.TargetPoolsScopedListWarningData>();
   o.add(buildTargetPoolsScopedListWarningData());
   o.add(buildTargetPoolsScopedListWarningData());
   return o;
 }
 
-checkUnnamed910(core.List<api.TargetPoolsScopedListWarningData> o) {
+checkUnnamed961(core.List<api.TargetPoolsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedListWarningData(o[0]);
   checkTargetPoolsScopedListWarningData(o[1]);
@@ -4145,7 +4145,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed910();
+    o.data = buildUnnamed961();
     o.message = "foo";
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4156,7 +4156,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed910(o.data);
+    checkUnnamed961(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4167,7 +4167,7 @@
   var o = new api.TargetPoolsScopedList();
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    o.targetPools = buildUnnamed909();
+    o.targetPools = buildUnnamed960();
     o.warning = buildTargetPoolsScopedListWarning();
   }
   buildCounterTargetPoolsScopedList--;
@@ -4177,7 +4177,7 @@
 checkTargetPoolsScopedList(api.TargetPoolsScopedList o) {
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    checkUnnamed909(o.targetPools);
+    checkUnnamed960(o.targetPools);
     checkTargetPoolsScopedListWarning(o.warning);
   }
   buildCounterTargetPoolsScopedList--;
@@ -4227,40 +4227,40 @@
   buildCounterTestFailure--;
 }
 
-buildUnnamed911() {
+buildUnnamed962() {
   var o = new core.List<api.HostRule>();
   o.add(buildHostRule());
   o.add(buildHostRule());
   return o;
 }
 
-checkUnnamed911(core.List<api.HostRule> o) {
+checkUnnamed962(core.List<api.HostRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHostRule(o[0]);
   checkHostRule(o[1]);
 }
 
-buildUnnamed912() {
+buildUnnamed963() {
   var o = new core.List<api.PathMatcher>();
   o.add(buildPathMatcher());
   o.add(buildPathMatcher());
   return o;
 }
 
-checkUnnamed912(core.List<api.PathMatcher> o) {
+checkUnnamed963(core.List<api.PathMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathMatcher(o[0]);
   checkPathMatcher(o[1]);
 }
 
-buildUnnamed913() {
+buildUnnamed964() {
   var o = new core.List<api.UrlMapTest>();
   o.add(buildUrlMapTest());
   o.add(buildUrlMapTest());
   return o;
 }
 
-checkUnnamed913(core.List<api.UrlMapTest> o) {
+checkUnnamed964(core.List<api.UrlMapTest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMapTest(o[0]);
   checkUrlMapTest(o[1]);
@@ -4275,13 +4275,13 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.hostRules = buildUnnamed911();
+    o.hostRules = buildUnnamed962();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.pathMatchers = buildUnnamed912();
+    o.pathMatchers = buildUnnamed963();
     o.selfLink = "foo";
-    o.tests = buildUnnamed913();
+    o.tests = buildUnnamed964();
   }
   buildCounterUrlMap--;
   return o;
@@ -4294,25 +4294,25 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed911(o.hostRules);
+    checkUnnamed962(o.hostRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed912(o.pathMatchers);
+    checkUnnamed963(o.pathMatchers);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed913(o.tests);
+    checkUnnamed964(o.tests);
   }
   buildCounterUrlMap--;
 }
 
-buildUnnamed914() {
+buildUnnamed965() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed914(core.List<api.UrlMap> o) {
+checkUnnamed965(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
@@ -4324,7 +4324,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed914();
+    o.items = buildUnnamed965();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4337,7 +4337,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed914(o.items);
+    checkUnnamed965(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4389,27 +4389,27 @@
   buildCounterUrlMapTest--;
 }
 
-buildUnnamed915() {
+buildUnnamed966() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed915(core.List<core.String> o) {
+checkUnnamed966(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed916() {
+buildUnnamed967() {
   var o = new core.List<api.TestFailure>();
   o.add(buildTestFailure());
   o.add(buildTestFailure());
   return o;
 }
 
-checkUnnamed916(core.List<api.TestFailure> o) {
+checkUnnamed967(core.List<api.TestFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestFailure(o[0]);
   checkTestFailure(o[1]);
@@ -4420,9 +4420,9 @@
   var o = new api.UrlMapValidationResult();
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    o.loadErrors = buildUnnamed915();
+    o.loadErrors = buildUnnamed966();
     o.loadSucceeded = true;
-    o.testFailures = buildUnnamed916();
+    o.testFailures = buildUnnamed967();
     o.testPassed = true;
   }
   buildCounterUrlMapValidationResult--;
@@ -4432,9 +4432,9 @@
 checkUrlMapValidationResult(api.UrlMapValidationResult o) {
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    checkUnnamed915(o.loadErrors);
+    checkUnnamed966(o.loadErrors);
     unittest.expect(o.loadSucceeded, unittest.isTrue);
-    checkUnnamed916(o.testFailures);
+    checkUnnamed967(o.testFailures);
     unittest.expect(o.testPassed, unittest.isTrue);
   }
   buildCounterUrlMapValidationResult--;
@@ -4524,14 +4524,14 @@
   buildCounterZoneMaintenanceWindows--;
 }
 
-buildUnnamed917() {
+buildUnnamed968() {
   var o = new core.List<api.ZoneMaintenanceWindows>();
   o.add(buildZoneMaintenanceWindows());
   o.add(buildZoneMaintenanceWindows());
   return o;
 }
 
-checkUnnamed917(core.List<api.ZoneMaintenanceWindows> o) {
+checkUnnamed968(core.List<api.ZoneMaintenanceWindows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZoneMaintenanceWindows(o[0]);
   checkZoneMaintenanceWindows(o[1]);
@@ -4547,7 +4547,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.maintenanceWindows = buildUnnamed917();
+    o.maintenanceWindows = buildUnnamed968();
     o.name = "foo";
     o.region = "foo";
     o.selfLink = "foo";
@@ -4565,7 +4565,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed917(o.maintenanceWindows);
+    checkUnnamed968(o.maintenanceWindows);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4574,14 +4574,14 @@
   buildCounterZone--;
 }
 
-buildUnnamed918() {
+buildUnnamed969() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed918(core.List<api.Zone> o) {
+checkUnnamed969(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -4593,7 +4593,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed918();
+    o.items = buildUnnamed969();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4606,7 +4606,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed918(o.items);
+    checkUnnamed969(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
diff --git a/generated/googleapis/test/content/v2_test.dart b/generated/googleapis/test/content/v2_test.dart
index db90909..30a9f4e 100644
--- a/generated/googleapis/test/content/v2_test.dart
+++ b/generated/googleapis/test/content/v2_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed738() {
+buildUnnamed295() {
   var o = new core.List<api.AccountAdwordsLink>();
   o.add(buildAccountAdwordsLink());
   o.add(buildAccountAdwordsLink());
   return o;
 }
 
-checkUnnamed738(core.List<api.AccountAdwordsLink> o) {
+checkUnnamed295(core.List<api.AccountAdwordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountAdwordsLink(o[0]);
   checkAccountAdwordsLink(o[1]);
 }
 
-buildUnnamed739() {
+buildUnnamed296() {
   var o = new core.List<api.AccountUser>();
   o.add(buildAccountUser());
   o.add(buildAccountUser());
   return o;
 }
 
-checkUnnamed739(core.List<api.AccountUser> o) {
+checkUnnamed296(core.List<api.AccountUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountUser(o[0]);
   checkAccountUser(o[1]);
@@ -48,13 +48,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     o.adultContent = true;
-    o.adwordsLinks = buildUnnamed738();
+    o.adwordsLinks = buildUnnamed295();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
     o.reviewsUrl = "foo";
     o.sellerId = "foo";
-    o.users = buildUnnamed739();
+    o.users = buildUnnamed296();
     o.websiteUrl = "foo";
   }
   buildCounterAccount--;
@@ -65,13 +65,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     unittest.expect(o.adultContent, unittest.isTrue);
-    checkUnnamed738(o.adwordsLinks);
+    checkUnnamed295(o.adwordsLinks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.reviewsUrl, unittest.equals('foo'));
     unittest.expect(o.sellerId, unittest.equals('foo'));
-    checkUnnamed739(o.users);
+    checkUnnamed296(o.users);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterAccount--;
@@ -98,14 +98,14 @@
   buildCounterAccountAdwordsLink--;
 }
 
-buildUnnamed740() {
+buildUnnamed297() {
   var o = new core.List<api.AccountStatusDataQualityIssue>();
   o.add(buildAccountStatusDataQualityIssue());
   o.add(buildAccountStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed740(core.List<api.AccountStatusDataQualityIssue> o) {
+checkUnnamed297(core.List<api.AccountStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusDataQualityIssue(o[0]);
   checkAccountStatusDataQualityIssue(o[1]);
@@ -117,7 +117,7 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     o.accountId = "foo";
-    o.dataQualityIssues = buildUnnamed740();
+    o.dataQualityIssues = buildUnnamed297();
     o.kind = "foo";
   }
   buildCounterAccountStatus--;
@@ -128,20 +128,20 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed740(o.dataQualityIssues);
+    checkUnnamed297(o.dataQualityIssues);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountStatus--;
 }
 
-buildUnnamed741() {
+buildUnnamed298() {
   var o = new core.List<api.AccountStatusExampleItem>();
   o.add(buildAccountStatusExampleItem());
   o.add(buildAccountStatusExampleItem());
   return o;
 }
 
-checkUnnamed741(core.List<api.AccountStatusExampleItem> o) {
+checkUnnamed298(core.List<api.AccountStatusExampleItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusExampleItem(o[0]);
   checkAccountStatusExampleItem(o[1]);
@@ -154,7 +154,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     o.country = "foo";
     o.displayedValue = "foo";
-    o.exampleItems = buildUnnamed741();
+    o.exampleItems = buildUnnamed298();
     o.id = "foo";
     o.lastChecked = "foo";
     o.numItems = 42;
@@ -170,7 +170,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.displayedValue, unittest.equals('foo'));
-    checkUnnamed741(o.exampleItems);
+    checkUnnamed298(o.exampleItems);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastChecked, unittest.equals('foo'));
     unittest.expect(o.numItems, unittest.equals(42));
@@ -228,14 +228,14 @@
   buildCounterAccountUser--;
 }
 
-buildUnnamed742() {
+buildUnnamed299() {
   var o = new core.List<api.AccountsCustomBatchRequestEntry>();
   o.add(buildAccountsCustomBatchRequestEntry());
   o.add(buildAccountsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed742(core.List<api.AccountsCustomBatchRequestEntry> o) {
+checkUnnamed299(core.List<api.AccountsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchRequestEntry(o[0]);
   checkAccountsCustomBatchRequestEntry(o[1]);
@@ -246,7 +246,7 @@
   var o = new api.AccountsCustomBatchRequest();
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed742();
+    o.entries = buildUnnamed299();
   }
   buildCounterAccountsCustomBatchRequest--;
   return o;
@@ -255,7 +255,7 @@
 checkAccountsCustomBatchRequest(api.AccountsCustomBatchRequest o) {
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    checkUnnamed742(o.entries);
+    checkUnnamed299(o.entries);
   }
   buildCounterAccountsCustomBatchRequest--;
 }
@@ -287,14 +287,14 @@
   buildCounterAccountsCustomBatchRequestEntry--;
 }
 
-buildUnnamed743() {
+buildUnnamed300() {
   var o = new core.List<api.AccountsCustomBatchResponseEntry>();
   o.add(buildAccountsCustomBatchResponseEntry());
   o.add(buildAccountsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed743(core.List<api.AccountsCustomBatchResponseEntry> o) {
+checkUnnamed300(core.List<api.AccountsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchResponseEntry(o[0]);
   checkAccountsCustomBatchResponseEntry(o[1]);
@@ -305,7 +305,7 @@
   var o = new api.AccountsCustomBatchResponse();
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed743();
+    o.entries = buildUnnamed300();
     o.kind = "foo";
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -315,7 +315,7 @@
 checkAccountsCustomBatchResponse(api.AccountsCustomBatchResponse o) {
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    checkUnnamed743(o.entries);
+    checkUnnamed300(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -346,14 +346,14 @@
   buildCounterAccountsCustomBatchResponseEntry--;
 }
 
-buildUnnamed744() {
+buildUnnamed301() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed744(core.List<api.Account> o) {
+checkUnnamed301(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -366,7 +366,7 @@
   if (buildCounterAccountsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed744();
+    o.resources = buildUnnamed301();
   }
   buildCounterAccountsListResponse--;
   return o;
@@ -377,19 +377,19 @@
   if (buildCounterAccountsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed744(o.resources);
+    checkUnnamed301(o.resources);
   }
   buildCounterAccountsListResponse--;
 }
 
-buildUnnamed745() {
+buildUnnamed302() {
   var o = new core.List<api.AccountstatusesCustomBatchRequestEntry>();
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed745(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
+checkUnnamed302(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchRequestEntry(o[0]);
   checkAccountstatusesCustomBatchRequestEntry(o[1]);
@@ -400,7 +400,7 @@
   var o = new api.AccountstatusesCustomBatchRequest();
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed745();
+    o.entries = buildUnnamed302();
   }
   buildCounterAccountstatusesCustomBatchRequest--;
   return o;
@@ -409,7 +409,7 @@
 checkAccountstatusesCustomBatchRequest(api.AccountstatusesCustomBatchRequest o) {
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    checkUnnamed745(o.entries);
+    checkUnnamed302(o.entries);
   }
   buildCounterAccountstatusesCustomBatchRequest--;
 }
@@ -439,14 +439,14 @@
   buildCounterAccountstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed746() {
+buildUnnamed303() {
   var o = new core.List<api.AccountstatusesCustomBatchResponseEntry>();
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed746(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
+checkUnnamed303(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchResponseEntry(o[0]);
   checkAccountstatusesCustomBatchResponseEntry(o[1]);
@@ -457,7 +457,7 @@
   var o = new api.AccountstatusesCustomBatchResponse();
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed746();
+    o.entries = buildUnnamed303();
     o.kind = "foo";
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -467,7 +467,7 @@
 checkAccountstatusesCustomBatchResponse(api.AccountstatusesCustomBatchResponse o) {
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    checkUnnamed746(o.entries);
+    checkUnnamed303(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -496,14 +496,14 @@
   buildCounterAccountstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed747() {
+buildUnnamed304() {
   var o = new core.List<api.AccountStatus>();
   o.add(buildAccountStatus());
   o.add(buildAccountStatus());
   return o;
 }
 
-checkUnnamed747(core.List<api.AccountStatus> o) {
+checkUnnamed304(core.List<api.AccountStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatus(o[0]);
   checkAccountStatus(o[1]);
@@ -516,7 +516,7 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed747();
+    o.resources = buildUnnamed304();
   }
   buildCounterAccountstatusesListResponse--;
   return o;
@@ -527,19 +527,19 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed747(o.resources);
+    checkUnnamed304(o.resources);
   }
   buildCounterAccountstatusesListResponse--;
 }
 
-buildUnnamed748() {
+buildUnnamed305() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed748(core.List<core.String> o) {
+checkUnnamed305(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -557,7 +557,7 @@
     o.fileName = "foo";
     o.format = buildDatafeedFormat();
     o.id = "foo";
-    o.intendedDestinations = buildUnnamed748();
+    o.intendedDestinations = buildUnnamed305();
     o.kind = "foo";
     o.name = "foo";
     o.targetCountry = "foo";
@@ -576,7 +576,7 @@
     unittest.expect(o.fileName, unittest.equals('foo'));
     checkDatafeedFormat(o.format);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed748(o.intendedDestinations);
+    checkUnnamed305(o.intendedDestinations);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
@@ -638,27 +638,27 @@
   buildCounterDatafeedFormat--;
 }
 
-buildUnnamed749() {
+buildUnnamed306() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed749(core.List<api.DatafeedStatusError> o) {
+checkUnnamed306(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
 }
 
-buildUnnamed750() {
+buildUnnamed307() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed750(core.List<api.DatafeedStatusError> o) {
+checkUnnamed307(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
@@ -670,12 +670,12 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     o.datafeedId = "foo";
-    o.errors = buildUnnamed749();
+    o.errors = buildUnnamed306();
     o.itemsTotal = "foo";
     o.itemsValid = "foo";
     o.kind = "foo";
     o.processingStatus = "foo";
-    o.warnings = buildUnnamed750();
+    o.warnings = buildUnnamed307();
   }
   buildCounterDatafeedStatus--;
   return o;
@@ -685,24 +685,24 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     unittest.expect(o.datafeedId, unittest.equals('foo'));
-    checkUnnamed749(o.errors);
+    checkUnnamed306(o.errors);
     unittest.expect(o.itemsTotal, unittest.equals('foo'));
     unittest.expect(o.itemsValid, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
-    checkUnnamed750(o.warnings);
+    checkUnnamed307(o.warnings);
   }
   buildCounterDatafeedStatus--;
 }
 
-buildUnnamed751() {
+buildUnnamed308() {
   var o = new core.List<api.DatafeedStatusExample>();
   o.add(buildDatafeedStatusExample());
   o.add(buildDatafeedStatusExample());
   return o;
 }
 
-checkUnnamed751(core.List<api.DatafeedStatusExample> o) {
+checkUnnamed308(core.List<api.DatafeedStatusExample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusExample(o[0]);
   checkDatafeedStatusExample(o[1]);
@@ -715,7 +715,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     o.code = "foo";
     o.count = "foo";
-    o.examples = buildUnnamed751();
+    o.examples = buildUnnamed308();
     o.message = "foo";
   }
   buildCounterDatafeedStatusError--;
@@ -727,7 +727,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed751(o.examples);
+    checkUnnamed308(o.examples);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDatafeedStatusError--;
@@ -756,14 +756,14 @@
   buildCounterDatafeedStatusExample--;
 }
 
-buildUnnamed752() {
+buildUnnamed309() {
   var o = new core.List<api.DatafeedsCustomBatchRequestEntry>();
   o.add(buildDatafeedsCustomBatchRequestEntry());
   o.add(buildDatafeedsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed752(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
+checkUnnamed309(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchRequestEntry(o[0]);
   checkDatafeedsCustomBatchRequestEntry(o[1]);
@@ -774,7 +774,7 @@
   var o = new api.DatafeedsCustomBatchRequest();
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed752();
+    o.entries = buildUnnamed309();
   }
   buildCounterDatafeedsCustomBatchRequest--;
   return o;
@@ -783,7 +783,7 @@
 checkDatafeedsCustomBatchRequest(api.DatafeedsCustomBatchRequest o) {
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    checkUnnamed752(o.entries);
+    checkUnnamed309(o.entries);
   }
   buildCounterDatafeedsCustomBatchRequest--;
 }
@@ -815,14 +815,14 @@
   buildCounterDatafeedsCustomBatchRequestEntry--;
 }
 
-buildUnnamed753() {
+buildUnnamed310() {
   var o = new core.List<api.DatafeedsCustomBatchResponseEntry>();
   o.add(buildDatafeedsCustomBatchResponseEntry());
   o.add(buildDatafeedsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed753(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
+checkUnnamed310(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchResponseEntry(o[0]);
   checkDatafeedsCustomBatchResponseEntry(o[1]);
@@ -833,7 +833,7 @@
   var o = new api.DatafeedsCustomBatchResponse();
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed753();
+    o.entries = buildUnnamed310();
     o.kind = "foo";
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -843,7 +843,7 @@
 checkDatafeedsCustomBatchResponse(api.DatafeedsCustomBatchResponse o) {
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    checkUnnamed753(o.entries);
+    checkUnnamed310(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -872,14 +872,14 @@
   buildCounterDatafeedsCustomBatchResponseEntry--;
 }
 
-buildUnnamed754() {
+buildUnnamed311() {
   var o = new core.List<api.Datafeed>();
   o.add(buildDatafeed());
   o.add(buildDatafeed());
   return o;
 }
 
-checkUnnamed754(core.List<api.Datafeed> o) {
+checkUnnamed311(core.List<api.Datafeed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeed(o[0]);
   checkDatafeed(o[1]);
@@ -891,7 +891,7 @@
   buildCounterDatafeedsListResponse++;
   if (buildCounterDatafeedsListResponse < 3) {
     o.kind = "foo";
-    o.resources = buildUnnamed754();
+    o.resources = buildUnnamed311();
   }
   buildCounterDatafeedsListResponse--;
   return o;
@@ -901,19 +901,19 @@
   buildCounterDatafeedsListResponse++;
   if (buildCounterDatafeedsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed754(o.resources);
+    checkUnnamed311(o.resources);
   }
   buildCounterDatafeedsListResponse--;
 }
 
-buildUnnamed755() {
+buildUnnamed312() {
   var o = new core.List<api.DatafeedstatusesCustomBatchRequestEntry>();
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed755(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
+checkUnnamed312(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchRequestEntry(o[0]);
   checkDatafeedstatusesCustomBatchRequestEntry(o[1]);
@@ -924,7 +924,7 @@
   var o = new api.DatafeedstatusesCustomBatchRequest();
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed755();
+    o.entries = buildUnnamed312();
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
   return o;
@@ -933,7 +933,7 @@
 checkDatafeedstatusesCustomBatchRequest(api.DatafeedstatusesCustomBatchRequest o) {
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    checkUnnamed755(o.entries);
+    checkUnnamed312(o.entries);
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
 }
@@ -963,14 +963,14 @@
   buildCounterDatafeedstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed756() {
+buildUnnamed313() {
   var o = new core.List<api.DatafeedstatusesCustomBatchResponseEntry>();
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed756(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
+checkUnnamed313(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchResponseEntry(o[0]);
   checkDatafeedstatusesCustomBatchResponseEntry(o[1]);
@@ -981,7 +981,7 @@
   var o = new api.DatafeedstatusesCustomBatchResponse();
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed756();
+    o.entries = buildUnnamed313();
     o.kind = "foo";
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -991,7 +991,7 @@
 checkDatafeedstatusesCustomBatchResponse(api.DatafeedstatusesCustomBatchResponse o) {
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    checkUnnamed756(o.entries);
+    checkUnnamed313(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -1020,14 +1020,14 @@
   buildCounterDatafeedstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed757() {
+buildUnnamed314() {
   var o = new core.List<api.DatafeedStatus>();
   o.add(buildDatafeedStatus());
   o.add(buildDatafeedStatus());
   return o;
 }
 
-checkUnnamed757(core.List<api.DatafeedStatus> o) {
+checkUnnamed314(core.List<api.DatafeedStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatus(o[0]);
   checkDatafeedStatus(o[1]);
@@ -1039,7 +1039,7 @@
   buildCounterDatafeedstatusesListResponse++;
   if (buildCounterDatafeedstatusesListResponse < 3) {
     o.kind = "foo";
-    o.resources = buildUnnamed757();
+    o.resources = buildUnnamed314();
   }
   buildCounterDatafeedstatusesListResponse--;
   return o;
@@ -1049,7 +1049,7 @@
   buildCounterDatafeedstatusesListResponse++;
   if (buildCounterDatafeedstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed757(o.resources);
+    checkUnnamed314(o.resources);
   }
   buildCounterDatafeedstatusesListResponse--;
 }
@@ -1077,14 +1077,14 @@
   buildCounterError--;
 }
 
-buildUnnamed758() {
+buildUnnamed315() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed758(core.List<api.Error> o) {
+checkUnnamed315(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1096,7 +1096,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     o.code = 42;
-    o.errors = buildUnnamed758();
+    o.errors = buildUnnamed315();
     o.message = "foo";
   }
   buildCounterErrors--;
@@ -1107,7 +1107,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed758(o.errors);
+    checkUnnamed315(o.errors);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterErrors--;
@@ -1142,14 +1142,14 @@
   buildCounterInventory--;
 }
 
-buildUnnamed759() {
+buildUnnamed316() {
   var o = new core.List<api.InventoryCustomBatchRequestEntry>();
   o.add(buildInventoryCustomBatchRequestEntry());
   o.add(buildInventoryCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed759(core.List<api.InventoryCustomBatchRequestEntry> o) {
+checkUnnamed316(core.List<api.InventoryCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchRequestEntry(o[0]);
   checkInventoryCustomBatchRequestEntry(o[1]);
@@ -1160,7 +1160,7 @@
   var o = new api.InventoryCustomBatchRequest();
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    o.entries = buildUnnamed759();
+    o.entries = buildUnnamed316();
   }
   buildCounterInventoryCustomBatchRequest--;
   return o;
@@ -1169,7 +1169,7 @@
 checkInventoryCustomBatchRequest(api.InventoryCustomBatchRequest o) {
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    checkUnnamed759(o.entries);
+    checkUnnamed316(o.entries);
   }
   buildCounterInventoryCustomBatchRequest--;
 }
@@ -1201,14 +1201,14 @@
   buildCounterInventoryCustomBatchRequestEntry--;
 }
 
-buildUnnamed760() {
+buildUnnamed317() {
   var o = new core.List<api.InventoryCustomBatchResponseEntry>();
   o.add(buildInventoryCustomBatchResponseEntry());
   o.add(buildInventoryCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed760(core.List<api.InventoryCustomBatchResponseEntry> o) {
+checkUnnamed317(core.List<api.InventoryCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchResponseEntry(o[0]);
   checkInventoryCustomBatchResponseEntry(o[1]);
@@ -1219,7 +1219,7 @@
   var o = new api.InventoryCustomBatchResponse();
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    o.entries = buildUnnamed760();
+    o.entries = buildUnnamed317();
     o.kind = "foo";
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1229,7 +1229,7 @@
 checkInventoryCustomBatchResponse(api.InventoryCustomBatchResponse o) {
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    checkUnnamed760(o.entries);
+    checkUnnamed317(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1348,131 +1348,131 @@
   buildCounterPrice--;
 }
 
-buildUnnamed761() {
+buildUnnamed318() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed761(core.List<core.String> o) {
+checkUnnamed318(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed762() {
+buildUnnamed319() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed762(core.List<core.String> o) {
+checkUnnamed319(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed763() {
+buildUnnamed320() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed763(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed320(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
 }
 
-buildUnnamed764() {
+buildUnnamed321() {
   var o = new core.List<api.ProductCustomGroup>();
   o.add(buildProductCustomGroup());
   o.add(buildProductCustomGroup());
   return o;
 }
 
-checkUnnamed764(core.List<api.ProductCustomGroup> o) {
+checkUnnamed321(core.List<api.ProductCustomGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomGroup(o[0]);
   checkProductCustomGroup(o[1]);
 }
 
-buildUnnamed765() {
+buildUnnamed322() {
   var o = new core.List<api.ProductDestination>();
   o.add(buildProductDestination());
   o.add(buildProductDestination());
   return o;
 }
 
-checkUnnamed765(core.List<api.ProductDestination> o) {
+checkUnnamed322(core.List<api.ProductDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductDestination(o[0]);
   checkProductDestination(o[1]);
 }
 
-buildUnnamed766() {
+buildUnnamed323() {
   var o = new core.List<api.ProductShipping>();
   o.add(buildProductShipping());
   o.add(buildProductShipping());
   return o;
 }
 
-checkUnnamed766(core.List<api.ProductShipping> o) {
+checkUnnamed323(core.List<api.ProductShipping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductShipping(o[0]);
   checkProductShipping(o[1]);
 }
 
-buildUnnamed767() {
+buildUnnamed324() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed767(core.List<core.String> o) {
+checkUnnamed324(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed768() {
+buildUnnamed325() {
   var o = new core.List<api.ProductTax>();
   o.add(buildProductTax());
   o.add(buildProductTax());
   return o;
 }
 
-checkUnnamed768(core.List<api.ProductTax> o) {
+checkUnnamed325(core.List<api.ProductTax> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductTax(o[0]);
   checkProductTax(o[1]);
 }
 
-buildUnnamed769() {
+buildUnnamed326() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed769(core.List<core.String> o) {
+checkUnnamed326(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed770() {
+buildUnnamed327() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed770(core.List<api.Error> o) {
+checkUnnamed327(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1483,10 +1483,10 @@
   var o = new api.Product();
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    o.additionalImageLinks = buildUnnamed761();
+    o.additionalImageLinks = buildUnnamed318();
     o.adult = true;
     o.adwordsGrouping = "foo";
-    o.adwordsLabels = buildUnnamed762();
+    o.adwordsLabels = buildUnnamed319();
     o.adwordsRedirect = "foo";
     o.ageGroup = "foo";
     o.availability = "foo";
@@ -1496,15 +1496,15 @@
     o.color = "foo";
     o.condition = "foo";
     o.contentLanguage = "foo";
-    o.customAttributes = buildUnnamed763();
-    o.customGroups = buildUnnamed764();
+    o.customAttributes = buildUnnamed320();
+    o.customGroups = buildUnnamed321();
     o.customLabel0 = "foo";
     o.customLabel1 = "foo";
     o.customLabel2 = "foo";
     o.customLabel3 = "foo";
     o.customLabel4 = "foo";
     o.description = "foo";
-    o.destinations = buildUnnamed765();
+    o.destinations = buildUnnamed322();
     o.energyEfficiencyClass = "foo";
     o.expirationDate = "foo";
     o.gender = "foo";
@@ -1530,19 +1530,19 @@
     o.productType = "foo";
     o.salePrice = buildPrice();
     o.salePriceEffectiveDate = "foo";
-    o.shipping = buildUnnamed766();
+    o.shipping = buildUnnamed323();
     o.shippingLabel = "foo";
     o.shippingWeight = buildProductShippingWeight();
     o.sizeSystem = "foo";
     o.sizeType = "foo";
-    o.sizes = buildUnnamed767();
+    o.sizes = buildUnnamed324();
     o.targetCountry = "foo";
-    o.taxes = buildUnnamed768();
+    o.taxes = buildUnnamed325();
     o.title = "foo";
     o.unitPricingBaseMeasure = buildProductUnitPricingBaseMeasure();
     o.unitPricingMeasure = buildProductUnitPricingMeasure();
-    o.validatedDestinations = buildUnnamed769();
-    o.warnings = buildUnnamed770();
+    o.validatedDestinations = buildUnnamed326();
+    o.warnings = buildUnnamed327();
   }
   buildCounterProduct--;
   return o;
@@ -1551,10 +1551,10 @@
 checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkUnnamed761(o.additionalImageLinks);
+    checkUnnamed318(o.additionalImageLinks);
     unittest.expect(o.adult, unittest.isTrue);
     unittest.expect(o.adwordsGrouping, unittest.equals('foo'));
-    checkUnnamed762(o.adwordsLabels);
+    checkUnnamed319(o.adwordsLabels);
     unittest.expect(o.adwordsRedirect, unittest.equals('foo'));
     unittest.expect(o.ageGroup, unittest.equals('foo'));
     unittest.expect(o.availability, unittest.equals('foo'));
@@ -1564,15 +1564,15 @@
     unittest.expect(o.color, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
-    checkUnnamed763(o.customAttributes);
-    checkUnnamed764(o.customGroups);
+    checkUnnamed320(o.customAttributes);
+    checkUnnamed321(o.customGroups);
     unittest.expect(o.customLabel0, unittest.equals('foo'));
     unittest.expect(o.customLabel1, unittest.equals('foo'));
     unittest.expect(o.customLabel2, unittest.equals('foo'));
     unittest.expect(o.customLabel3, unittest.equals('foo'));
     unittest.expect(o.customLabel4, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed765(o.destinations);
+    checkUnnamed322(o.destinations);
     unittest.expect(o.energyEfficiencyClass, unittest.equals('foo'));
     unittest.expect(o.expirationDate, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
@@ -1598,19 +1598,19 @@
     unittest.expect(o.productType, unittest.equals('foo'));
     checkPrice(o.salePrice);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
-    checkUnnamed766(o.shipping);
+    checkUnnamed323(o.shipping);
     unittest.expect(o.shippingLabel, unittest.equals('foo'));
     checkProductShippingWeight(o.shippingWeight);
     unittest.expect(o.sizeSystem, unittest.equals('foo'));
     unittest.expect(o.sizeType, unittest.equals('foo'));
-    checkUnnamed767(o.sizes);
+    checkUnnamed324(o.sizes);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
-    checkUnnamed768(o.taxes);
+    checkUnnamed325(o.taxes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkProductUnitPricingBaseMeasure(o.unitPricingBaseMeasure);
     checkProductUnitPricingMeasure(o.unitPricingMeasure);
-    checkUnnamed769(o.validatedDestinations);
-    checkUnnamed770(o.warnings);
+    checkUnnamed326(o.validatedDestinations);
+    checkUnnamed327(o.warnings);
   }
   buildCounterProduct--;
 }
@@ -1640,14 +1640,14 @@
   buildCounterProductCustomAttribute--;
 }
 
-buildUnnamed771() {
+buildUnnamed328() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed771(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed328(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
@@ -1658,7 +1658,7 @@
   var o = new api.ProductCustomGroup();
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    o.attributes = buildUnnamed771();
+    o.attributes = buildUnnamed328();
     o.name = "foo";
   }
   buildCounterProductCustomGroup--;
@@ -1668,7 +1668,7 @@
 checkProductCustomGroup(api.ProductCustomGroup o) {
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    checkUnnamed771(o.attributes);
+    checkUnnamed328(o.attributes);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterProductCustomGroup--;
@@ -1768,27 +1768,27 @@
   buildCounterProductShippingWeight--;
 }
 
-buildUnnamed772() {
+buildUnnamed329() {
   var o = new core.List<api.ProductStatusDataQualityIssue>();
   o.add(buildProductStatusDataQualityIssue());
   o.add(buildProductStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed772(core.List<api.ProductStatusDataQualityIssue> o) {
+checkUnnamed329(core.List<api.ProductStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDataQualityIssue(o[0]);
   checkProductStatusDataQualityIssue(o[1]);
 }
 
-buildUnnamed773() {
+buildUnnamed330() {
   var o = new core.List<api.ProductStatusDestinationStatus>();
   o.add(buildProductStatusDestinationStatus());
   o.add(buildProductStatusDestinationStatus());
   return o;
 }
 
-checkUnnamed773(core.List<api.ProductStatusDestinationStatus> o) {
+checkUnnamed330(core.List<api.ProductStatusDestinationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDestinationStatus(o[0]);
   checkProductStatusDestinationStatus(o[1]);
@@ -1799,8 +1799,8 @@
   var o = new api.ProductStatus();
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    o.dataQualityIssues = buildUnnamed772();
-    o.destinationStatuses = buildUnnamed773();
+    o.dataQualityIssues = buildUnnamed329();
+    o.destinationStatuses = buildUnnamed330();
     o.kind = "foo";
     o.link = "foo";
     o.productId = "foo";
@@ -1813,8 +1813,8 @@
 checkProductStatus(api.ProductStatus o) {
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    checkUnnamed772(o.dataQualityIssues);
-    checkUnnamed773(o.destinationStatuses);
+    checkUnnamed329(o.dataQualityIssues);
+    checkUnnamed330(o.destinationStatuses);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
@@ -1948,14 +1948,14 @@
   buildCounterProductUnitPricingMeasure--;
 }
 
-buildUnnamed774() {
+buildUnnamed331() {
   var o = new core.List<api.ProductsCustomBatchRequestEntry>();
   o.add(buildProductsCustomBatchRequestEntry());
   o.add(buildProductsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed774(core.List<api.ProductsCustomBatchRequestEntry> o) {
+checkUnnamed331(core.List<api.ProductsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchRequestEntry(o[0]);
   checkProductsCustomBatchRequestEntry(o[1]);
@@ -1966,7 +1966,7 @@
   var o = new api.ProductsCustomBatchRequest();
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed774();
+    o.entries = buildUnnamed331();
   }
   buildCounterProductsCustomBatchRequest--;
   return o;
@@ -1975,7 +1975,7 @@
 checkProductsCustomBatchRequest(api.ProductsCustomBatchRequest o) {
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    checkUnnamed774(o.entries);
+    checkUnnamed331(o.entries);
   }
   buildCounterProductsCustomBatchRequest--;
 }
@@ -2007,14 +2007,14 @@
   buildCounterProductsCustomBatchRequestEntry--;
 }
 
-buildUnnamed775() {
+buildUnnamed332() {
   var o = new core.List<api.ProductsCustomBatchResponseEntry>();
   o.add(buildProductsCustomBatchResponseEntry());
   o.add(buildProductsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed775(core.List<api.ProductsCustomBatchResponseEntry> o) {
+checkUnnamed332(core.List<api.ProductsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchResponseEntry(o[0]);
   checkProductsCustomBatchResponseEntry(o[1]);
@@ -2025,7 +2025,7 @@
   var o = new api.ProductsCustomBatchResponse();
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed775();
+    o.entries = buildUnnamed332();
     o.kind = "foo";
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2035,7 +2035,7 @@
 checkProductsCustomBatchResponse(api.ProductsCustomBatchResponse o) {
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    checkUnnamed775(o.entries);
+    checkUnnamed332(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2066,14 +2066,14 @@
   buildCounterProductsCustomBatchResponseEntry--;
 }
 
-buildUnnamed776() {
+buildUnnamed333() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed776(core.List<api.Product> o) {
+checkUnnamed333(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -2086,7 +2086,7 @@
   if (buildCounterProductsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed776();
+    o.resources = buildUnnamed333();
   }
   buildCounterProductsListResponse--;
   return o;
@@ -2097,19 +2097,19 @@
   if (buildCounterProductsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed776(o.resources);
+    checkUnnamed333(o.resources);
   }
   buildCounterProductsListResponse--;
 }
 
-buildUnnamed777() {
+buildUnnamed334() {
   var o = new core.List<api.ProductstatusesCustomBatchRequestEntry>();
   o.add(buildProductstatusesCustomBatchRequestEntry());
   o.add(buildProductstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed777(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
+checkUnnamed334(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchRequestEntry(o[0]);
   checkProductstatusesCustomBatchRequestEntry(o[1]);
@@ -2120,7 +2120,7 @@
   var o = new api.ProductstatusesCustomBatchRequest();
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed777();
+    o.entries = buildUnnamed334();
   }
   buildCounterProductstatusesCustomBatchRequest--;
   return o;
@@ -2129,7 +2129,7 @@
 checkProductstatusesCustomBatchRequest(api.ProductstatusesCustomBatchRequest o) {
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    checkUnnamed777(o.entries);
+    checkUnnamed334(o.entries);
   }
   buildCounterProductstatusesCustomBatchRequest--;
 }
@@ -2159,14 +2159,14 @@
   buildCounterProductstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed778() {
+buildUnnamed335() {
   var o = new core.List<api.ProductstatusesCustomBatchResponseEntry>();
   o.add(buildProductstatusesCustomBatchResponseEntry());
   o.add(buildProductstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed778(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
+checkUnnamed335(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchResponseEntry(o[0]);
   checkProductstatusesCustomBatchResponseEntry(o[1]);
@@ -2177,7 +2177,7 @@
   var o = new api.ProductstatusesCustomBatchResponse();
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed778();
+    o.entries = buildUnnamed335();
     o.kind = "foo";
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2187,7 +2187,7 @@
 checkProductstatusesCustomBatchResponse(api.ProductstatusesCustomBatchResponse o) {
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    checkUnnamed778(o.entries);
+    checkUnnamed335(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2218,14 +2218,14 @@
   buildCounterProductstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed779() {
+buildUnnamed336() {
   var o = new core.List<api.ProductStatus>();
   o.add(buildProductStatus());
   o.add(buildProductStatus());
   return o;
 }
 
-checkUnnamed779(core.List<api.ProductStatus> o) {
+checkUnnamed336(core.List<api.ProductStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatus(o[0]);
   checkProductStatus(o[1]);
@@ -2238,7 +2238,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed779();
+    o.resources = buildUnnamed336();
   }
   buildCounterProductstatusesListResponse--;
   return o;
@@ -2249,7 +2249,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed779(o.resources);
+    checkUnnamed336(o.resources);
   }
   buildCounterProductstatusesListResponse--;
 }
diff --git a/generated/googleapis/test/coordinate/v1_test.dart b/generated/googleapis/test/coordinate/v1_test.dart
index e04096c..f3e9795 100644
--- a/generated/googleapis/test/coordinate/v1_test.dart
+++ b/generated/googleapis/test/coordinate/v1_test.dart
@@ -68,14 +68,14 @@
   buildCounterCustomFieldDef--;
 }
 
-buildUnnamed220() {
+buildUnnamed452() {
   var o = new core.List<api.CustomFieldDef>();
   o.add(buildCustomFieldDef());
   o.add(buildCustomFieldDef());
   return o;
 }
 
-checkUnnamed220(core.List<api.CustomFieldDef> o) {
+checkUnnamed452(core.List<api.CustomFieldDef> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomFieldDef(o[0]);
   checkCustomFieldDef(o[1]);
@@ -86,7 +86,7 @@
   var o = new api.CustomFieldDefListResponse();
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    o.items = buildUnnamed220();
+    o.items = buildUnnamed452();
     o.kind = "foo";
   }
   buildCounterCustomFieldDefListResponse--;
@@ -96,20 +96,20 @@
 checkCustomFieldDefListResponse(api.CustomFieldDefListResponse o) {
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    checkUnnamed220(o.items);
+    checkUnnamed452(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFieldDefListResponse--;
 }
 
-buildUnnamed221() {
+buildUnnamed453() {
   var o = new core.List<api.CustomField>();
   o.add(buildCustomField());
   o.add(buildCustomField());
   return o;
 }
 
-checkUnnamed221(core.List<api.CustomField> o) {
+checkUnnamed453(core.List<api.CustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomField(o[0]);
   checkCustomField(o[1]);
@@ -120,7 +120,7 @@
   var o = new api.CustomFields();
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    o.customField = buildUnnamed221();
+    o.customField = buildUnnamed453();
     o.kind = "foo";
   }
   buildCounterCustomFields--;
@@ -130,20 +130,20 @@
 checkCustomFields(api.CustomFields o) {
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    checkUnnamed221(o.customField);
+    checkUnnamed453(o.customField);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFields--;
 }
 
-buildUnnamed222() {
+buildUnnamed454() {
   var o = new core.List<api.JobChange>();
   o.add(buildJobChange());
   o.add(buildJobChange());
   return o;
 }
 
-checkUnnamed222(core.List<api.JobChange> o) {
+checkUnnamed454(core.List<api.JobChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobChange(o[0]);
   checkJobChange(o[1]);
@@ -155,7 +155,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     o.id = "foo";
-    o.jobChange = buildUnnamed222();
+    o.jobChange = buildUnnamed454();
     o.kind = "foo";
     o.state = buildJobState();
   }
@@ -167,7 +167,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed222(o.jobChange);
+    checkUnnamed454(o.jobChange);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkJobState(o.state);
   }
@@ -197,14 +197,14 @@
   buildCounterJobChange--;
 }
 
-buildUnnamed223() {
+buildUnnamed455() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed223(core.List<api.Job> o) {
+checkUnnamed455(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.JobListResponse();
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    o.items = buildUnnamed223();
+    o.items = buildUnnamed455();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -226,21 +226,21 @@
 checkJobListResponse(api.JobListResponse o) {
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    checkUnnamed223(o.items);
+    checkUnnamed455(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterJobListResponse--;
 }
 
-buildUnnamed224() {
+buildUnnamed456() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed224(core.List<core.String> o) {
+checkUnnamed456(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -257,7 +257,7 @@
     o.customerPhoneNumber = "foo";
     o.kind = "foo";
     o.location = buildLocation();
-    o.note = buildUnnamed224();
+    o.note = buildUnnamed456();
     o.progress = "foo";
     o.title = "foo";
   }
@@ -274,21 +274,21 @@
     unittest.expect(o.customerPhoneNumber, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed224(o.note);
+    checkUnnamed456(o.note);
     unittest.expect(o.progress, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterJobState--;
 }
 
-buildUnnamed225() {
+buildUnnamed457() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed225(core.List<core.String> o) {
+checkUnnamed457(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -299,7 +299,7 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.addressLine = buildUnnamed225();
+    o.addressLine = buildUnnamed457();
     o.kind = "foo";
     o.lat = 42.0;
     o.lng = 42.0;
@@ -311,7 +311,7 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed225(o.addressLine);
+    checkUnnamed457(o.addressLine);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lat, unittest.equals(42.0));
     unittest.expect(o.lng, unittest.equals(42.0));
@@ -319,14 +319,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed226() {
+buildUnnamed458() {
   var o = new core.List<api.LocationRecord>();
   o.add(buildLocationRecord());
   o.add(buildLocationRecord());
   return o;
 }
 
-checkUnnamed226(core.List<api.LocationRecord> o) {
+checkUnnamed458(core.List<api.LocationRecord> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocationRecord(o[0]);
   checkLocationRecord(o[1]);
@@ -337,7 +337,7 @@
   var o = new api.LocationListResponse();
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    o.items = buildUnnamed226();
+    o.items = buildUnnamed458();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.tokenPagination = buildTokenPagination();
@@ -349,7 +349,7 @@
 checkLocationListResponse(api.LocationListResponse o) {
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    checkUnnamed226(o.items);
+    checkUnnamed458(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkTokenPagination(o.tokenPagination);
@@ -455,14 +455,14 @@
   buildCounterWorker--;
 }
 
-buildUnnamed227() {
+buildUnnamed459() {
   var o = new core.List<api.Worker>();
   o.add(buildWorker());
   o.add(buildWorker());
   return o;
 }
 
-checkUnnamed227(core.List<api.Worker> o) {
+checkUnnamed459(core.List<api.Worker> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorker(o[0]);
   checkWorker(o[1]);
@@ -473,7 +473,7 @@
   var o = new api.WorkerListResponse();
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    o.items = buildUnnamed227();
+    o.items = buildUnnamed459();
     o.kind = "foo";
   }
   buildCounterWorkerListResponse--;
@@ -483,46 +483,46 @@
 checkWorkerListResponse(api.WorkerListResponse o) {
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    checkUnnamed227(o.items);
+    checkUnnamed459(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWorkerListResponse--;
 }
 
-buildUnnamed228() {
+buildUnnamed460() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed228(core.List<core.String> o) {
+checkUnnamed460(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed229() {
+buildUnnamed461() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed229(core.List<core.String> o) {
+checkUnnamed461(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed230() {
+buildUnnamed462() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed230(core.List<core.String> o) {
+checkUnnamed462(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -766,7 +766,7 @@
       var arg_lng = 42.0;
       var arg_title = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed228();
+      var arg_customField = buildUnnamed460();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_note = "foo";
@@ -876,7 +876,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed229();
+      var arg_customField = buildUnnamed461();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
@@ -943,7 +943,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed230();
+      var arg_customField = buildUnnamed462();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index fe2dfa3..8b91ce5 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -39,30 +39,30 @@
   buildCounterContextFacets--;
 }
 
-buildUnnamed171() {
+buildUnnamed264() {
   var o = new core.List<api.ContextFacets>();
   o.add(buildContextFacets());
   o.add(buildContextFacets());
   return o;
 }
 
-checkUnnamed171(core.List<api.ContextFacets> o) {
+checkUnnamed264(core.List<api.ContextFacets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextFacets(o[0]);
   checkContextFacets(o[1]);
 }
 
-buildUnnamed172() {
+buildUnnamed265() {
   var o = new core.List<core.List<api.ContextFacets>>();
-  o.add(buildUnnamed171());
-  o.add(buildUnnamed171());
+  o.add(buildUnnamed264());
+  o.add(buildUnnamed264());
   return o;
 }
 
-checkUnnamed172(core.List<core.List<api.ContextFacets>> o) {
+checkUnnamed265(core.List<core.List<api.ContextFacets>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed171(o[0]);
-  checkUnnamed171(o[1]);
+  checkUnnamed264(o[0]);
+  checkUnnamed264(o[1]);
 }
 
 core.int buildCounterContext = 0;
@@ -70,7 +70,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.facets = buildUnnamed172();
+    o.facets = buildUnnamed265();
     o.title = "foo";
   }
   buildCounterContext--;
@@ -80,7 +80,7 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed172(o.facets);
+    checkUnnamed265(o.facets);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterContext--;
@@ -111,14 +111,14 @@
   buildCounterPromotionBodyLines--;
 }
 
-buildUnnamed173() {
+buildUnnamed266() {
   var o = new core.List<api.PromotionBodyLines>();
   o.add(buildPromotionBodyLines());
   o.add(buildPromotionBodyLines());
   return o;
 }
 
-checkUnnamed173(core.List<api.PromotionBodyLines> o) {
+checkUnnamed266(core.List<api.PromotionBodyLines> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotionBodyLines(o[0]);
   checkPromotionBodyLines(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.Promotion();
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    o.bodyLines = buildUnnamed173();
+    o.bodyLines = buildUnnamed266();
     o.displayLink = "foo";
     o.htmlTitle = "foo";
     o.image = buildPromotionImage();
@@ -166,7 +166,7 @@
 checkPromotion(api.Promotion o) {
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    checkUnnamed173(o.bodyLines);
+    checkUnnamed266(o.bodyLines);
     unittest.expect(o.displayLink, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkPromotionImage(o.image);
@@ -321,56 +321,56 @@
   buildCounterResultLabels--;
 }
 
-buildUnnamed174() {
+buildUnnamed267() {
   var o = new core.List<api.ResultLabels>();
   o.add(buildResultLabels());
   o.add(buildResultLabels());
   return o;
 }
 
-checkUnnamed174(core.List<api.ResultLabels> o) {
+checkUnnamed267(core.List<api.ResultLabels> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultLabels(o[0]);
   checkResultLabels(o[1]);
 }
 
-buildUnnamed175() {
+buildUnnamed268() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   return o;
 }
 
-checkUnnamed175(core.Map<core.String, core.Object> o) {
+checkUnnamed268(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o["x"]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed176() {
+buildUnnamed269() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed175());
-  o.add(buildUnnamed175());
+  o.add(buildUnnamed268());
+  o.add(buildUnnamed268());
   return o;
 }
 
-checkUnnamed176(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed269(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed175(o[0]);
-  checkUnnamed175(o[1]);
+  checkUnnamed268(o[0]);
+  checkUnnamed268(o[1]);
 }
 
-buildUnnamed177() {
+buildUnnamed270() {
   var o = new core.Map<core.String, core.List<core.Map<core.String, core.Object>>>();
-  o["x"] = buildUnnamed176();
-  o["y"] = buildUnnamed176();
+  o["x"] = buildUnnamed269();
+  o["y"] = buildUnnamed269();
   return o;
 }
 
-checkUnnamed177(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
+checkUnnamed270(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed176(o["x"]);
-  checkUnnamed176(o["y"]);
+  checkUnnamed269(o["x"]);
+  checkUnnamed269(o["y"]);
 }
 
 core.int buildCounterResult = 0;
@@ -387,10 +387,10 @@
     o.htmlTitle = "foo";
     o.image = buildResultImage();
     o.kind = "foo";
-    o.labels = buildUnnamed174();
+    o.labels = buildUnnamed267();
     o.link = "foo";
     o.mime = "foo";
-    o.pagemap = buildUnnamed177();
+    o.pagemap = buildUnnamed270();
     o.snippet = "foo";
     o.title = "foo";
   }
@@ -410,66 +410,66 @@
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkResultImage(o.image);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed174(o.labels);
+    checkUnnamed267(o.labels);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.mime, unittest.equals('foo'));
-    checkUnnamed177(o.pagemap);
+    checkUnnamed270(o.pagemap);
     unittest.expect(o.snippet, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterResult--;
 }
 
-buildUnnamed178() {
+buildUnnamed271() {
   var o = new core.List<api.Result>();
   o.add(buildResult());
   o.add(buildResult());
   return o;
 }
 
-checkUnnamed178(core.List<api.Result> o) {
+checkUnnamed271(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResult(o[0]);
   checkResult(o[1]);
 }
 
-buildUnnamed179() {
+buildUnnamed272() {
   var o = new core.List<api.Promotion>();
   o.add(buildPromotion());
   o.add(buildPromotion());
   return o;
 }
 
-checkUnnamed179(core.List<api.Promotion> o) {
+checkUnnamed272(core.List<api.Promotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotion(o[0]);
   checkPromotion(o[1]);
 }
 
-buildUnnamed180() {
+buildUnnamed273() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed180(core.List<api.Query> o) {
+checkUnnamed273(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
 }
 
-buildUnnamed181() {
+buildUnnamed274() {
   var o = new core.Map<core.String, core.List<api.Query>>();
-  o["x"] = buildUnnamed180();
-  o["y"] = buildUnnamed180();
+  o["x"] = buildUnnamed273();
+  o["y"] = buildUnnamed273();
   return o;
 }
 
-checkUnnamed181(core.Map<core.String, core.List<api.Query>> o) {
+checkUnnamed274(core.Map<core.String, core.List<api.Query>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed180(o["x"]);
-  checkUnnamed180(o["y"]);
+  checkUnnamed273(o["x"]);
+  checkUnnamed273(o["y"]);
 }
 
 core.int buildCounterSearchSearchInformation = 0;
@@ -545,10 +545,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     o.context = buildContext();
-    o.items = buildUnnamed178();
+    o.items = buildUnnamed271();
     o.kind = "foo";
-    o.promotions = buildUnnamed179();
-    o.queries = buildUnnamed181();
+    o.promotions = buildUnnamed272();
+    o.queries = buildUnnamed274();
     o.searchInformation = buildSearchSearchInformation();
     o.spelling = buildSearchSpelling();
     o.url = buildSearchUrl();
@@ -561,10 +561,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     checkContext(o.context);
-    checkUnnamed178(o.items);
+    checkUnnamed271(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed179(o.promotions);
-    checkUnnamed181(o.queries);
+    checkUnnamed272(o.promotions);
+    checkUnnamed274(o.queries);
     checkSearchSearchInformation(o.searchInformation);
     checkSearchSpelling(o.spelling);
     checkSearchUrl(o.url);
diff --git a/generated/googleapis/test/dfareporting/v1_3_test.dart b/generated/googleapis/test/dfareporting/v1_3_test.dart
index 3024cc8..01928f2 100644
--- a/generated/googleapis/test/dfareporting/v1_3_test.dart
+++ b/generated/googleapis/test/dfareporting/v1_3_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed385() {
+buildUnnamed187() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed385(core.List<api.DimensionValue> o) {
+checkUnnamed187(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed386() {
+buildUnnamed188() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed386(core.List<core.String> o) {
+checkUnnamed188(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -47,9 +47,9 @@
   var o = new api.Activities();
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    o.filters = buildUnnamed385();
+    o.filters = buildUnnamed187();
     o.kind = "foo";
-    o.metricNames = buildUnnamed386();
+    o.metricNames = buildUnnamed188();
   }
   buildCounterActivities--;
   return o;
@@ -58,9 +58,9 @@
 checkActivities(api.Activities o) {
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    checkUnnamed385(o.filters);
+    checkUnnamed187(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed386(o.metricNames);
+    checkUnnamed188(o.metricNames);
   }
   buildCounterActivities--;
 }
@@ -94,53 +94,53 @@
   buildCounterCompatibleFields--;
 }
 
-buildUnnamed387() {
+buildUnnamed189() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed387(core.List<api.Dimension> o) {
+checkUnnamed189(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed388() {
+buildUnnamed190() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed388(core.List<api.Dimension> o) {
+checkUnnamed190(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed389() {
+buildUnnamed191() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed389(core.List<api.Metric> o) {
+checkUnnamed191(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed390() {
+buildUnnamed192() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed390(core.List<api.Metric> o) {
+checkUnnamed192(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -151,11 +151,11 @@
   var o = new api.CrossDimensionReachReportCompatibleFields();
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    o.breakdown = buildUnnamed387();
-    o.dimensionFilters = buildUnnamed388();
+    o.breakdown = buildUnnamed189();
+    o.dimensionFilters = buildUnnamed190();
     o.kind = "foo";
-    o.metrics = buildUnnamed389();
-    o.overlapMetrics = buildUnnamed390();
+    o.metrics = buildUnnamed191();
+    o.overlapMetrics = buildUnnamed192();
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
   return o;
@@ -164,23 +164,23 @@
 checkCrossDimensionReachReportCompatibleFields(api.CrossDimensionReachReportCompatibleFields o) {
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    checkUnnamed387(o.breakdown);
-    checkUnnamed388(o.dimensionFilters);
+    checkUnnamed189(o.breakdown);
+    checkUnnamed190(o.dimensionFilters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed389(o.metrics);
-    checkUnnamed390(o.overlapMetrics);
+    checkUnnamed191(o.metrics);
+    checkUnnamed192(o.overlapMetrics);
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
 }
 
-buildUnnamed391() {
+buildUnnamed193() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed391(core.List<api.DimensionValue> o) {
+checkUnnamed193(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -191,7 +191,7 @@
   var o = new api.CustomRichMediaEvents();
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    o.filteredEventIds = buildUnnamed391();
+    o.filteredEventIds = buildUnnamed193();
     o.kind = "foo";
   }
   buildCounterCustomRichMediaEvents--;
@@ -201,7 +201,7 @@
 checkCustomRichMediaEvents(api.CustomRichMediaEvents o) {
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    checkUnnamed391(o.filteredEventIds);
+    checkUnnamed193(o.filteredEventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomRichMediaEvents--;
@@ -305,14 +305,14 @@
   buildCounterDimensionValue--;
 }
 
-buildUnnamed392() {
+buildUnnamed194() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed392(core.List<api.DimensionValue> o) {
+checkUnnamed194(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -324,7 +324,7 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed392();
+    o.items = buildUnnamed194();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -336,21 +336,21 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed392(o.items);
+    checkUnnamed194(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDimensionValueList--;
 }
 
-buildUnnamed393() {
+buildUnnamed195() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed393(core.List<api.DimensionFilter> o) {
+checkUnnamed195(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -363,7 +363,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     o.dimensionName = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.filters = buildUnnamed393();
+    o.filters = buildUnnamed195();
     o.kind = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -376,7 +376,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     unittest.expect(o.dimensionName, unittest.equals('foo'));
     unittest.expect(o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed393(o.filters);
+    checkUnnamed195(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -441,14 +441,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed394() {
+buildUnnamed196() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed394(core.List<api.File> o) {
+checkUnnamed196(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -460,7 +460,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed394();
+    o.items = buildUnnamed196();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -472,47 +472,47 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed394(o.items);
+    checkUnnamed196(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFileList--;
 }
 
-buildUnnamed395() {
+buildUnnamed197() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed395(core.List<api.Dimension> o) {
+checkUnnamed197(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed396() {
+buildUnnamed198() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed396(core.List<api.Dimension> o) {
+checkUnnamed198(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed397() {
+buildUnnamed199() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed397(core.List<api.Metric> o) {
+checkUnnamed199(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -523,10 +523,10 @@
   var o = new api.FloodlightReportCompatibleFields();
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed395();
-    o.dimensions = buildUnnamed396();
+    o.dimensionFilters = buildUnnamed197();
+    o.dimensions = buildUnnamed198();
     o.kind = "foo";
-    o.metrics = buildUnnamed397();
+    o.metrics = buildUnnamed199();
   }
   buildCounterFloodlightReportCompatibleFields--;
   return o;
@@ -535,10 +535,10 @@
 checkFloodlightReportCompatibleFields(api.FloodlightReportCompatibleFields o) {
   buildCounterFloodlightReportCompatibleFields++;
   if (buildCounterFloodlightReportCompatibleFields < 3) {
-    checkUnnamed395(o.dimensionFilters);
-    checkUnnamed396(o.dimensions);
+    checkUnnamed197(o.dimensionFilters);
+    checkUnnamed198(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed397(o.metrics);
+    checkUnnamed199(o.metrics);
   }
   buildCounterFloodlightReportCompatibleFields--;
 }
@@ -564,53 +564,53 @@
   buildCounterMetric--;
 }
 
-buildUnnamed398() {
+buildUnnamed200() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed398(core.List<api.Dimension> o) {
+checkUnnamed200(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed399() {
+buildUnnamed201() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed399(core.List<api.Dimension> o) {
+checkUnnamed201(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed400() {
+buildUnnamed202() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed400(core.List<api.Metric> o) {
+checkUnnamed202(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed401() {
+buildUnnamed203() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed401(core.List<api.Dimension> o) {
+checkUnnamed203(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
@@ -621,11 +621,11 @@
   var o = new api.PathToConversionReportCompatibleFields();
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    o.conversionDimensions = buildUnnamed398();
-    o.customFloodlightVariables = buildUnnamed399();
+    o.conversionDimensions = buildUnnamed200();
+    o.customFloodlightVariables = buildUnnamed201();
     o.kind = "foo";
-    o.metrics = buildUnnamed400();
-    o.perInteractionDimensions = buildUnnamed401();
+    o.metrics = buildUnnamed202();
+    o.perInteractionDimensions = buildUnnamed203();
   }
   buildCounterPathToConversionReportCompatibleFields--;
   return o;
@@ -634,75 +634,75 @@
 checkPathToConversionReportCompatibleFields(api.PathToConversionReportCompatibleFields o) {
   buildCounterPathToConversionReportCompatibleFields++;
   if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    checkUnnamed398(o.conversionDimensions);
-    checkUnnamed399(o.customFloodlightVariables);
+    checkUnnamed200(o.conversionDimensions);
+    checkUnnamed201(o.customFloodlightVariables);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed400(o.metrics);
-    checkUnnamed401(o.perInteractionDimensions);
+    checkUnnamed202(o.metrics);
+    checkUnnamed203(o.perInteractionDimensions);
   }
   buildCounterPathToConversionReportCompatibleFields--;
 }
 
-buildUnnamed402() {
+buildUnnamed204() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed402(core.List<api.Dimension> o) {
+checkUnnamed204(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed403() {
+buildUnnamed205() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed403(core.List<api.Dimension> o) {
+checkUnnamed205(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed404() {
+buildUnnamed206() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed404(core.List<api.Metric> o) {
+checkUnnamed206(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed405() {
+buildUnnamed207() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed405(core.List<api.Metric> o) {
+checkUnnamed207(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed406() {
+buildUnnamed208() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed406(core.List<api.Metric> o) {
+checkUnnamed208(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -713,12 +713,12 @@
   var o = new api.ReachReportCompatibleFields();
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed402();
-    o.dimensions = buildUnnamed403();
+    o.dimensionFilters = buildUnnamed204();
+    o.dimensions = buildUnnamed205();
     o.kind = "foo";
-    o.metrics = buildUnnamed404();
-    o.pivotedActivityMetrics = buildUnnamed405();
-    o.reachByFrequencyMetrics = buildUnnamed406();
+    o.metrics = buildUnnamed206();
+    o.pivotedActivityMetrics = buildUnnamed207();
+    o.reachByFrequencyMetrics = buildUnnamed208();
   }
   buildCounterReachReportCompatibleFields--;
   return o;
@@ -727,12 +727,12 @@
 checkReachReportCompatibleFields(api.ReachReportCompatibleFields o) {
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    checkUnnamed402(o.dimensionFilters);
-    checkUnnamed403(o.dimensions);
+    checkUnnamed204(o.dimensionFilters);
+    checkUnnamed205(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed404(o.metrics);
-    checkUnnamed405(o.pivotedActivityMetrics);
-    checkUnnamed406(o.reachByFrequencyMetrics);
+    checkUnnamed206(o.metrics);
+    checkUnnamed207(o.pivotedActivityMetrics);
+    checkUnnamed208(o.reachByFrequencyMetrics);
   }
   buildCounterReachReportCompatibleFields--;
 }
@@ -760,40 +760,40 @@
   buildCounterRecipient--;
 }
 
-buildUnnamed407() {
+buildUnnamed209() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed407(core.List<api.DimensionValue> o) {
+checkUnnamed209(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed408() {
+buildUnnamed210() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed408(core.List<api.SortedDimension> o) {
+checkUnnamed210(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed409() {
+buildUnnamed211() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed409(core.List<core.String> o) {
+checkUnnamed211(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -805,9 +805,9 @@
   buildCounterReportActiveGrpCriteria++;
   if (buildCounterReportActiveGrpCriteria < 3) {
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed407();
-    o.dimensions = buildUnnamed408();
-    o.metricNames = buildUnnamed409();
+    o.dimensionFilters = buildUnnamed209();
+    o.dimensions = buildUnnamed210();
+    o.metricNames = buildUnnamed211();
   }
   buildCounterReportActiveGrpCriteria--;
   return o;
@@ -817,47 +817,47 @@
   buildCounterReportActiveGrpCriteria++;
   if (buildCounterReportActiveGrpCriteria < 3) {
     checkDateRange(o.dateRange);
-    checkUnnamed407(o.dimensionFilters);
-    checkUnnamed408(o.dimensions);
-    checkUnnamed409(o.metricNames);
+    checkUnnamed209(o.dimensionFilters);
+    checkUnnamed210(o.dimensions);
+    checkUnnamed211(o.metricNames);
   }
   buildCounterReportActiveGrpCriteria--;
 }
 
-buildUnnamed410() {
+buildUnnamed212() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed410(core.List<api.DimensionValue> o) {
+checkUnnamed212(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed411() {
+buildUnnamed213() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed411(core.List<api.SortedDimension> o) {
+checkUnnamed213(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed412() {
+buildUnnamed214() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed412(core.List<core.String> o) {
+checkUnnamed214(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -871,9 +871,9 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed410();
-    o.dimensions = buildUnnamed411();
-    o.metricNames = buildUnnamed412();
+    o.dimensionFilters = buildUnnamed212();
+    o.dimensions = buildUnnamed213();
+    o.metricNames = buildUnnamed214();
   }
   buildCounterReportCriteria--;
   return o;
@@ -885,60 +885,60 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed410(o.dimensionFilters);
-    checkUnnamed411(o.dimensions);
-    checkUnnamed412(o.metricNames);
+    checkUnnamed212(o.dimensionFilters);
+    checkUnnamed213(o.dimensions);
+    checkUnnamed214(o.metricNames);
   }
   buildCounterReportCriteria--;
 }
 
-buildUnnamed413() {
+buildUnnamed215() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed413(core.List<api.SortedDimension> o) {
+checkUnnamed215(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed414() {
+buildUnnamed216() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed414(core.List<api.DimensionValue> o) {
+checkUnnamed216(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed415() {
+buildUnnamed217() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed415(core.List<core.String> o) {
+checkUnnamed217(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed416() {
+buildUnnamed218() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed416(core.List<core.String> o) {
+checkUnnamed218(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -949,12 +949,12 @@
   var o = new api.ReportCrossDimensionReachCriteria();
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    o.breakdown = buildUnnamed413();
+    o.breakdown = buildUnnamed215();
     o.dateRange = buildDateRange();
     o.dimension = "foo";
-    o.dimensionFilters = buildUnnamed414();
-    o.metricNames = buildUnnamed415();
-    o.overlapMetricNames = buildUnnamed416();
+    o.dimensionFilters = buildUnnamed216();
+    o.metricNames = buildUnnamed217();
+    o.overlapMetricNames = buildUnnamed218();
     o.pivoted = true;
   }
   buildCounterReportCrossDimensionReachCriteria--;
@@ -964,25 +964,25 @@
 checkReportCrossDimensionReachCriteria(api.ReportCrossDimensionReachCriteria o) {
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    checkUnnamed413(o.breakdown);
+    checkUnnamed215(o.breakdown);
     checkDateRange(o.dateRange);
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkUnnamed414(o.dimensionFilters);
-    checkUnnamed415(o.metricNames);
-    checkUnnamed416(o.overlapMetricNames);
+    checkUnnamed216(o.dimensionFilters);
+    checkUnnamed217(o.metricNames);
+    checkUnnamed218(o.overlapMetricNames);
     unittest.expect(o.pivoted, unittest.isTrue);
   }
   buildCounterReportCrossDimensionReachCriteria--;
 }
 
-buildUnnamed417() {
+buildUnnamed219() {
   var o = new core.List<api.Recipient>();
   o.add(buildRecipient());
   o.add(buildRecipient());
   return o;
 }
 
-checkUnnamed417(core.List<api.Recipient> o) {
+checkUnnamed219(core.List<api.Recipient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRecipient(o[0]);
   checkRecipient(o[1]);
@@ -996,7 +996,7 @@
     o.emailOwner = true;
     o.emailOwnerDeliveryType = "foo";
     o.message = "foo";
-    o.recipients = buildUnnamed417();
+    o.recipients = buildUnnamed219();
   }
   buildCounterReportDelivery--;
   return o;
@@ -1008,58 +1008,58 @@
     unittest.expect(o.emailOwner, unittest.isTrue);
     unittest.expect(o.emailOwnerDeliveryType, unittest.equals('foo'));
     unittest.expect(o.message, unittest.equals('foo'));
-    checkUnnamed417(o.recipients);
+    checkUnnamed219(o.recipients);
   }
   buildCounterReportDelivery--;
 }
 
-buildUnnamed418() {
+buildUnnamed220() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed418(core.List<api.DimensionValue> o) {
+checkUnnamed220(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed419() {
+buildUnnamed221() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed419(core.List<api.DimensionValue> o) {
+checkUnnamed221(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed420() {
+buildUnnamed222() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed420(core.List<api.SortedDimension> o) {
+checkUnnamed222(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed421() {
+buildUnnamed223() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed421(core.List<core.String> o) {
+checkUnnamed223(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1093,12 +1093,12 @@
   var o = new api.ReportFloodlightCriteria();
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    o.customRichMediaEvents = buildUnnamed418();
+    o.customRichMediaEvents = buildUnnamed220();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed419();
-    o.dimensions = buildUnnamed420();
+    o.dimensionFilters = buildUnnamed221();
+    o.dimensions = buildUnnamed222();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed421();
+    o.metricNames = buildUnnamed223();
     o.reportProperties = buildReportFloodlightCriteriaReportProperties();
   }
   buildCounterReportFloodlightCriteria--;
@@ -1108,90 +1108,90 @@
 checkReportFloodlightCriteria(api.ReportFloodlightCriteria o) {
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    checkUnnamed418(o.customRichMediaEvents);
+    checkUnnamed220(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed419(o.dimensionFilters);
-    checkUnnamed420(o.dimensions);
+    checkUnnamed221(o.dimensionFilters);
+    checkUnnamed222(o.dimensions);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed421(o.metricNames);
+    checkUnnamed223(o.metricNames);
     checkReportFloodlightCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportFloodlightCriteria--;
 }
 
-buildUnnamed422() {
+buildUnnamed224() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed422(core.List<api.DimensionValue> o) {
+checkUnnamed224(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed423() {
+buildUnnamed225() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed423(core.List<api.SortedDimension> o) {
+checkUnnamed225(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed424() {
+buildUnnamed226() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed424(core.List<api.SortedDimension> o) {
+checkUnnamed226(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed425() {
+buildUnnamed227() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed425(core.List<api.DimensionValue> o) {
+checkUnnamed227(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed426() {
+buildUnnamed228() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed426(core.List<core.String> o) {
+checkUnnamed228(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed427() {
+buildUnnamed229() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed427(core.List<api.SortedDimension> o) {
+checkUnnamed229(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
@@ -1237,14 +1237,14 @@
   var o = new api.ReportPathToConversionCriteria();
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    o.activityFilters = buildUnnamed422();
-    o.conversionDimensions = buildUnnamed423();
-    o.customFloodlightVariables = buildUnnamed424();
-    o.customRichMediaEvents = buildUnnamed425();
+    o.activityFilters = buildUnnamed224();
+    o.conversionDimensions = buildUnnamed225();
+    o.customFloodlightVariables = buildUnnamed226();
+    o.customRichMediaEvents = buildUnnamed227();
     o.dateRange = buildDateRange();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed426();
-    o.perInteractionDimensions = buildUnnamed427();
+    o.metricNames = buildUnnamed228();
+    o.perInteractionDimensions = buildUnnamed229();
     o.reportProperties = buildReportPathToConversionCriteriaReportProperties();
   }
   buildCounterReportPathToConversionCriteria--;
@@ -1254,66 +1254,66 @@
 checkReportPathToConversionCriteria(api.ReportPathToConversionCriteria o) {
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    checkUnnamed422(o.activityFilters);
-    checkUnnamed423(o.conversionDimensions);
-    checkUnnamed424(o.customFloodlightVariables);
-    checkUnnamed425(o.customRichMediaEvents);
+    checkUnnamed224(o.activityFilters);
+    checkUnnamed225(o.conversionDimensions);
+    checkUnnamed226(o.customFloodlightVariables);
+    checkUnnamed227(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed426(o.metricNames);
-    checkUnnamed427(o.perInteractionDimensions);
+    checkUnnamed228(o.metricNames);
+    checkUnnamed229(o.perInteractionDimensions);
     checkReportPathToConversionCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportPathToConversionCriteria--;
 }
 
-buildUnnamed428() {
+buildUnnamed230() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed428(core.List<api.DimensionValue> o) {
+checkUnnamed230(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed429() {
+buildUnnamed231() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed429(core.List<api.SortedDimension> o) {
+checkUnnamed231(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed430() {
+buildUnnamed232() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed430(core.List<core.String> o) {
+checkUnnamed232(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed431() {
+buildUnnamed233() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed431(core.List<core.String> o) {
+checkUnnamed233(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1327,10 +1327,10 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed428();
-    o.dimensions = buildUnnamed429();
-    o.metricNames = buildUnnamed430();
-    o.reachByFrequencyMetricNames = buildUnnamed431();
+    o.dimensionFilters = buildUnnamed230();
+    o.dimensions = buildUnnamed231();
+    o.metricNames = buildUnnamed232();
+    o.reachByFrequencyMetricNames = buildUnnamed233();
   }
   buildCounterReportReachCriteria--;
   return o;
@@ -1342,22 +1342,22 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed428(o.dimensionFilters);
-    checkUnnamed429(o.dimensions);
-    checkUnnamed430(o.metricNames);
-    checkUnnamed431(o.reachByFrequencyMetricNames);
+    checkUnnamed230(o.dimensionFilters);
+    checkUnnamed231(o.dimensions);
+    checkUnnamed232(o.metricNames);
+    checkUnnamed233(o.reachByFrequencyMetricNames);
   }
   buildCounterReportReachCriteria--;
 }
 
-buildUnnamed432() {
+buildUnnamed234() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed432(core.List<core.String> o) {
+checkUnnamed234(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1372,7 +1372,7 @@
     o.every = 42;
     o.expirationDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.repeats = "foo";
-    o.repeatsOnWeekDays = buildUnnamed432();
+    o.repeatsOnWeekDays = buildUnnamed234();
     o.runsOnDayOfMonth = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -1387,7 +1387,7 @@
     unittest.expect(o.every, unittest.equals(42));
     unittest.expect(o.expirationDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.repeats, unittest.equals('foo'));
-    checkUnnamed432(o.repeatsOnWeekDays);
+    checkUnnamed234(o.repeatsOnWeekDays);
     unittest.expect(o.runsOnDayOfMonth, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -1449,53 +1449,53 @@
   buildCounterReport--;
 }
 
-buildUnnamed433() {
+buildUnnamed235() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed433(core.List<api.Dimension> o) {
+checkUnnamed235(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed434() {
+buildUnnamed236() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed434(core.List<api.Dimension> o) {
+checkUnnamed236(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed435() {
+buildUnnamed237() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed435(core.List<api.Metric> o) {
+checkUnnamed237(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed436() {
+buildUnnamed238() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed436(core.List<api.Metric> o) {
+checkUnnamed238(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -1506,11 +1506,11 @@
   var o = new api.ReportCompatibleFields();
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed433();
-    o.dimensions = buildUnnamed434();
+    o.dimensionFilters = buildUnnamed235();
+    o.dimensions = buildUnnamed236();
     o.kind = "foo";
-    o.metrics = buildUnnamed435();
-    o.pivotedActivityMetrics = buildUnnamed436();
+    o.metrics = buildUnnamed237();
+    o.pivotedActivityMetrics = buildUnnamed238();
   }
   buildCounterReportCompatibleFields--;
   return o;
@@ -1519,23 +1519,23 @@
 checkReportCompatibleFields(api.ReportCompatibleFields o) {
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    checkUnnamed433(o.dimensionFilters);
-    checkUnnamed434(o.dimensions);
+    checkUnnamed235(o.dimensionFilters);
+    checkUnnamed236(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed435(o.metrics);
-    checkUnnamed436(o.pivotedActivityMetrics);
+    checkUnnamed237(o.metrics);
+    checkUnnamed238(o.pivotedActivityMetrics);
   }
   buildCounterReportCompatibleFields--;
 }
 
-buildUnnamed437() {
+buildUnnamed239() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed437(core.List<api.Report> o) {
+checkUnnamed239(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -1547,7 +1547,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed437();
+    o.items = buildUnnamed239();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1559,7 +1559,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed437(o.items);
+    checkUnnamed239(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1622,14 +1622,14 @@
   buildCounterUserProfile--;
 }
 
-buildUnnamed438() {
+buildUnnamed240() {
   var o = new core.List<api.UserProfile>();
   o.add(buildUserProfile());
   o.add(buildUserProfile());
   return o;
 }
 
-checkUnnamed438(core.List<api.UserProfile> o) {
+checkUnnamed240(core.List<api.UserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserProfile(o[0]);
   checkUserProfile(o[1]);
@@ -1641,7 +1641,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed438();
+    o.items = buildUnnamed240();
     o.kind = "foo";
   }
   buildCounterUserProfileList--;
@@ -1652,7 +1652,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed438(o.items);
+    checkUnnamed240(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUserProfileList--;
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index 75ddf3b..908e259 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDirectoryListItemsIcons--;
 }
 
-buildUnnamed570() {
+buildUnnamed275() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed570(core.List<core.String> o) {
+checkUnnamed275(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,7 +62,7 @@
     o.icons = buildDirectoryListItemsIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed570();
+    o.labels = buildUnnamed275();
     o.name = "foo";
     o.preferred = true;
     o.title = "foo";
@@ -82,7 +82,7 @@
     checkDirectoryListItemsIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed570(o.labels);
+    checkUnnamed275(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.preferred, unittest.isTrue);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -91,14 +91,14 @@
   buildCounterDirectoryListItems--;
 }
 
-buildUnnamed571() {
+buildUnnamed276() {
   var o = new core.List<api.DirectoryListItems>();
   o.add(buildDirectoryListItems());
   o.add(buildDirectoryListItems());
   return o;
 }
 
-checkUnnamed571(core.List<api.DirectoryListItems> o) {
+checkUnnamed276(core.List<api.DirectoryListItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectoryListItems(o[0]);
   checkDirectoryListItems(o[1]);
@@ -110,7 +110,7 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     o.discoveryVersion = "foo";
-    o.items = buildUnnamed571();
+    o.items = buildUnnamed276();
     o.kind = "foo";
   }
   buildCounterDirectoryList--;
@@ -121,20 +121,20 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
-    checkUnnamed571(o.items);
+    checkUnnamed276(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectoryList--;
 }
 
-buildUnnamed572() {
+buildUnnamed277() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed572(core.List<core.String> o) {
+checkUnnamed277(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -145,7 +145,7 @@
   var o = new api.JsonSchemaAnnotations();
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    o.required = buildUnnamed572();
+    o.required = buildUnnamed277();
   }
   buildCounterJsonSchemaAnnotations--;
   return o;
@@ -154,45 +154,45 @@
 checkJsonSchemaAnnotations(api.JsonSchemaAnnotations o) {
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    checkUnnamed572(o.required);
+    checkUnnamed277(o.required);
   }
   buildCounterJsonSchemaAnnotations--;
 }
 
-buildUnnamed573() {
+buildUnnamed278() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed573(core.List<core.String> o) {
+checkUnnamed278(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed574() {
+buildUnnamed279() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed574(core.List<core.String> o) {
+checkUnnamed279(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed575() {
+buildUnnamed280() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed575(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed280(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -219,14 +219,14 @@
   buildCounterJsonSchemaVariantMap--;
 }
 
-buildUnnamed576() {
+buildUnnamed281() {
   var o = new core.List<api.JsonSchemaVariantMap>();
   o.add(buildJsonSchemaVariantMap());
   o.add(buildJsonSchemaVariantMap());
   return o;
 }
 
-checkUnnamed576(core.List<api.JsonSchemaVariantMap> o) {
+checkUnnamed281(core.List<api.JsonSchemaVariantMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchemaVariantMap(o[0]);
   checkJsonSchemaVariantMap(o[1]);
@@ -238,7 +238,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     o.discriminant = "foo";
-    o.map = buildUnnamed576();
+    o.map = buildUnnamed281();
   }
   buildCounterJsonSchemaVariant--;
   return o;
@@ -248,7 +248,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     unittest.expect(o.discriminant, unittest.equals('foo'));
-    checkUnnamed576(o.map);
+    checkUnnamed281(o.map);
   }
   buildCounterJsonSchemaVariant--;
 }
@@ -263,8 +263,8 @@
     o.annotations = buildJsonSchemaAnnotations();
     o.default_ = "foo";
     o.description = "foo";
-    o.enum_ = buildUnnamed573();
-    o.enumDescriptions = buildUnnamed574();
+    o.enum_ = buildUnnamed278();
+    o.enumDescriptions = buildUnnamed279();
     o.format = "foo";
     o.id = "foo";
     o.items = buildJsonSchema();
@@ -272,7 +272,7 @@
     o.maximum = "foo";
     o.minimum = "foo";
     o.pattern = "foo";
-    o.properties = buildUnnamed575();
+    o.properties = buildUnnamed280();
     o.readOnly = true;
     o.repeated = true;
     o.required = true;
@@ -291,8 +291,8 @@
     checkJsonSchemaAnnotations(o.annotations);
     unittest.expect(o.default_, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed573(o.enum_);
-    checkUnnamed574(o.enumDescriptions);
+    checkUnnamed278(o.enum_);
+    checkUnnamed279(o.enumDescriptions);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkJsonSchema(o.items);
@@ -300,7 +300,7 @@
     unittest.expect(o.maximum, unittest.equals('foo'));
     unittest.expect(o.minimum, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed575(o.properties);
+    checkUnnamed280(o.properties);
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.repeated, unittest.isTrue);
     unittest.expect(o.required, unittest.isTrue);
@@ -329,14 +329,14 @@
   buildCounterRestDescriptionAuthOauth2ScopesValue--;
 }
 
-buildUnnamed577() {
+buildUnnamed282() {
   var o = new core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue>();
   o["x"] = buildRestDescriptionAuthOauth2ScopesValue();
   o["y"] = buildRestDescriptionAuthOauth2ScopesValue();
   return o;
 }
 
-checkUnnamed577(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
+checkUnnamed282(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestDescriptionAuthOauth2ScopesValue(o["x"]);
   checkRestDescriptionAuthOauth2ScopesValue(o["y"]);
@@ -347,7 +347,7 @@
   var o = new api.RestDescriptionAuthOauth2();
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    o.scopes = buildUnnamed577();
+    o.scopes = buildUnnamed282();
   }
   buildCounterRestDescriptionAuthOauth2--;
   return o;
@@ -356,7 +356,7 @@
 checkRestDescriptionAuthOauth2(api.RestDescriptionAuthOauth2 o) {
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    checkUnnamed577(o.scopes);
+    checkUnnamed282(o.scopes);
   }
   buildCounterRestDescriptionAuthOauth2--;
 }
@@ -380,14 +380,14 @@
   buildCounterRestDescriptionAuth--;
 }
 
-buildUnnamed578() {
+buildUnnamed283() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed578(core.List<core.String> o) {
+checkUnnamed283(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -414,66 +414,66 @@
   buildCounterRestDescriptionIcons--;
 }
 
-buildUnnamed579() {
+buildUnnamed284() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed579(core.List<core.String> o) {
+checkUnnamed284(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed580() {
+buildUnnamed285() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed580(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed285(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed581() {
+buildUnnamed286() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed581(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed286(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
 }
 
-buildUnnamed582() {
+buildUnnamed287() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed582(core.Map<core.String, api.RestResource> o) {
+checkUnnamed287(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
 }
 
-buildUnnamed583() {
+buildUnnamed288() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed583(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed288(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -493,22 +493,22 @@
     o.discoveryVersion = "foo";
     o.documentationLink = "foo";
     o.etag = "foo";
-    o.features = buildUnnamed578();
+    o.features = buildUnnamed283();
     o.icons = buildRestDescriptionIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed579();
-    o.methods = buildUnnamed580();
+    o.labels = buildUnnamed284();
+    o.methods = buildUnnamed285();
     o.name = "foo";
     o.ownerDomain = "foo";
     o.ownerName = "foo";
     o.packagePath = "foo";
-    o.parameters = buildUnnamed581();
+    o.parameters = buildUnnamed286();
     o.protocol = "foo";
-    o.resources = buildUnnamed582();
+    o.resources = buildUnnamed287();
     o.revision = "foo";
     o.rootUrl = "foo";
-    o.schemas = buildUnnamed583();
+    o.schemas = buildUnnamed288();
     o.servicePath = "foo";
     o.title = "foo";
     o.version = "foo";
@@ -529,22 +529,22 @@
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
     unittest.expect(o.documentationLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed578(o.features);
+    checkUnnamed283(o.features);
     checkRestDescriptionIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed579(o.labels);
-    checkUnnamed580(o.methods);
+    checkUnnamed284(o.labels);
+    checkUnnamed285(o.methods);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ownerDomain, unittest.equals('foo'));
     unittest.expect(o.ownerName, unittest.equals('foo'));
     unittest.expect(o.packagePath, unittest.equals('foo'));
-    checkUnnamed581(o.parameters);
+    checkUnnamed286(o.parameters);
     unittest.expect(o.protocol, unittest.equals('foo'));
-    checkUnnamed582(o.resources);
+    checkUnnamed287(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     unittest.expect(o.rootUrl, unittest.equals('foo'));
-    checkUnnamed583(o.schemas);
+    checkUnnamed288(o.schemas);
     unittest.expect(o.servicePath, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -552,14 +552,14 @@
   buildCounterRestDescription--;
 }
 
-buildUnnamed584() {
+buildUnnamed289() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed584(core.List<core.String> o) {
+checkUnnamed289(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -633,7 +633,7 @@
   var o = new api.RestMethodMediaUpload();
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    o.accept = buildUnnamed584();
+    o.accept = buildUnnamed289();
     o.maxSize = "foo";
     o.protocols = buildRestMethodMediaUploadProtocols();
   }
@@ -644,34 +644,34 @@
 checkRestMethodMediaUpload(api.RestMethodMediaUpload o) {
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    checkUnnamed584(o.accept);
+    checkUnnamed289(o.accept);
     unittest.expect(o.maxSize, unittest.equals('foo'));
     checkRestMethodMediaUploadProtocols(o.protocols);
   }
   buildCounterRestMethodMediaUpload--;
 }
 
-buildUnnamed585() {
+buildUnnamed290() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed585(core.List<core.String> o) {
+checkUnnamed290(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed586() {
+buildUnnamed291() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed586(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed291(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -717,14 +717,14 @@
   buildCounterRestMethodResponse--;
 }
 
-buildUnnamed587() {
+buildUnnamed292() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed587(core.List<core.String> o) {
+checkUnnamed292(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -740,12 +740,12 @@
     o.httpMethod = "foo";
     o.id = "foo";
     o.mediaUpload = buildRestMethodMediaUpload();
-    o.parameterOrder = buildUnnamed585();
-    o.parameters = buildUnnamed586();
+    o.parameterOrder = buildUnnamed290();
+    o.parameters = buildUnnamed291();
     o.path = "foo";
     o.request = buildRestMethodRequest();
     o.response = buildRestMethodResponse();
-    o.scopes = buildUnnamed587();
+    o.scopes = buildUnnamed292();
     o.supportsMediaDownload = true;
     o.supportsMediaUpload = true;
     o.supportsSubscription = true;
@@ -762,12 +762,12 @@
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkRestMethodMediaUpload(o.mediaUpload);
-    checkUnnamed585(o.parameterOrder);
-    checkUnnamed586(o.parameters);
+    checkUnnamed290(o.parameterOrder);
+    checkUnnamed291(o.parameters);
     unittest.expect(o.path, unittest.equals('foo'));
     checkRestMethodRequest(o.request);
     checkRestMethodResponse(o.response);
-    checkUnnamed587(o.scopes);
+    checkUnnamed292(o.scopes);
     unittest.expect(o.supportsMediaDownload, unittest.isTrue);
     unittest.expect(o.supportsMediaUpload, unittest.isTrue);
     unittest.expect(o.supportsSubscription, unittest.isTrue);
@@ -775,27 +775,27 @@
   buildCounterRestMethod--;
 }
 
-buildUnnamed588() {
+buildUnnamed293() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed588(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed293(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed589() {
+buildUnnamed294() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed589(core.Map<core.String, api.RestResource> o) {
+checkUnnamed294(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
@@ -806,8 +806,8 @@
   var o = new api.RestResource();
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    o.methods = buildUnnamed588();
-    o.resources = buildUnnamed589();
+    o.methods = buildUnnamed293();
+    o.resources = buildUnnamed294();
   }
   buildCounterRestResource--;
   return o;
@@ -816,8 +816,8 @@
 checkRestResource(api.RestResource o) {
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    checkUnnamed588(o.methods);
-    checkUnnamed589(o.resources);
+    checkUnnamed293(o.methods);
+    checkUnnamed294(o.resources);
   }
   buildCounterRestResource--;
 }
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
index c68ff6f..c634583 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1061() {
+buildUnnamed702() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1061(core.List<core.String> o) {
+checkUnnamed702(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.DownloadLineItemsRequest();
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    o.filterIds = buildUnnamed1061();
+    o.filterIds = buildUnnamed702();
     o.filterType = "foo";
     o.format = "foo";
   }
@@ -45,7 +45,7 @@
 checkDownloadLineItemsRequest(api.DownloadLineItemsRequest o) {
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    checkUnnamed1061(o.filterIds);
+    checkUnnamed702(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
   }
@@ -92,14 +92,14 @@
   buildCounterFilterPair--;
 }
 
-buildUnnamed1062() {
+buildUnnamed703() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed1062(core.List<api.Query> o) {
+checkUnnamed703(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
@@ -111,7 +111,7 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     o.kind = "foo";
-    o.queries = buildUnnamed1062();
+    o.queries = buildUnnamed703();
   }
   buildCounterListQueriesResponse--;
   return o;
@@ -121,19 +121,19 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1062(o.queries);
+    checkUnnamed703(o.queries);
   }
   buildCounterListQueriesResponse--;
 }
 
-buildUnnamed1063() {
+buildUnnamed704() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed1063(core.List<api.Report> o) {
+checkUnnamed704(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -145,7 +145,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.kind = "foo";
-    o.reports = buildUnnamed1063();
+    o.reports = buildUnnamed704();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -155,45 +155,45 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1063(o.reports);
+    checkUnnamed704(o.reports);
   }
   buildCounterListReportsResponse--;
 }
 
-buildUnnamed1064() {
+buildUnnamed705() {
   var o = new core.List<api.FilterPair>();
   o.add(buildFilterPair());
   o.add(buildFilterPair());
   return o;
 }
 
-checkUnnamed1064(core.List<api.FilterPair> o) {
+checkUnnamed705(core.List<api.FilterPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterPair(o[0]);
   checkFilterPair(o[1]);
 }
 
-buildUnnamed1065() {
+buildUnnamed706() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1065(core.List<core.String> o) {
+checkUnnamed706(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1066() {
+buildUnnamed707() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1066(core.List<core.String> o) {
+checkUnnamed707(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -204,10 +204,10 @@
   var o = new api.Parameters();
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    o.filters = buildUnnamed1064();
-    o.groupBys = buildUnnamed1065();
+    o.filters = buildUnnamed705();
+    o.groupBys = buildUnnamed706();
     o.includeInviteData = true;
-    o.metrics = buildUnnamed1066();
+    o.metrics = buildUnnamed707();
     o.type = "foo";
   }
   buildCounterParameters--;
@@ -217,10 +217,10 @@
 checkParameters(api.Parameters o) {
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    checkUnnamed1064(o.filters);
-    checkUnnamed1065(o.groupBys);
+    checkUnnamed705(o.filters);
+    checkUnnamed706(o.groupBys);
     unittest.expect(o.includeInviteData, unittest.isTrue);
-    checkUnnamed1066(o.metrics);
+    checkUnnamed707(o.metrics);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterParameters--;
@@ -259,14 +259,14 @@
   buildCounterQuery--;
 }
 
-buildUnnamed1067() {
+buildUnnamed708() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1067(core.List<core.String> o) {
+checkUnnamed708(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -285,7 +285,7 @@
     o.reportCount = 42;
     o.running = true;
     o.sendNotification = true;
-    o.shareEmailAddress = buildUnnamed1067();
+    o.shareEmailAddress = buildUnnamed708();
     o.title = "foo";
   }
   buildCounterQueryMetadata--;
@@ -303,7 +303,7 @@
     unittest.expect(o.reportCount, unittest.equals(42));
     unittest.expect(o.running, unittest.isTrue);
     unittest.expect(o.sendNotification, unittest.isTrue);
-    checkUnnamed1067(o.shareEmailAddress);
+    checkUnnamed708(o.shareEmailAddress);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterQueryMetadata--;
@@ -447,14 +447,14 @@
   buildCounterReportStatus--;
 }
 
-buildUnnamed1068() {
+buildUnnamed709() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1068(core.List<core.String> o) {
+checkUnnamed709(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -468,7 +468,7 @@
     o.changed = true;
     o.entityId = "foo";
     o.entityName = "foo";
-    o.errors = buildUnnamed1068();
+    o.errors = buildUnnamed709();
     o.persisted = true;
     o.rowNumber = 42;
   }
@@ -482,7 +482,7 @@
     unittest.expect(o.changed, unittest.isTrue);
     unittest.expect(o.entityId, unittest.equals('foo'));
     unittest.expect(o.entityName, unittest.equals('foo'));
-    checkUnnamed1068(o.errors);
+    checkUnnamed709(o.errors);
     unittest.expect(o.persisted, unittest.isTrue);
     unittest.expect(o.rowNumber, unittest.equals(42));
   }
@@ -556,27 +556,27 @@
   buildCounterUploadLineItemsResponse--;
 }
 
-buildUnnamed1069() {
+buildUnnamed710() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1069(core.List<core.String> o) {
+checkUnnamed710(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1070() {
+buildUnnamed711() {
   var o = new core.List<api.RowStatus>();
   o.add(buildRowStatus());
   o.add(buildRowStatus());
   return o;
 }
 
-checkUnnamed1070(core.List<api.RowStatus> o) {
+checkUnnamed711(core.List<api.RowStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowStatus(o[0]);
   checkRowStatus(o[1]);
@@ -587,8 +587,8 @@
   var o = new api.UploadStatus();
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    o.errors = buildUnnamed1069();
-    o.rowStatus = buildUnnamed1070();
+    o.errors = buildUnnamed710();
+    o.rowStatus = buildUnnamed711();
   }
   buildCounterUploadStatus--;
   return o;
@@ -597,8 +597,8 @@
 checkUploadStatus(api.UploadStatus o) {
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    checkUnnamed1069(o.errors);
-    checkUnnamed1070(o.rowStatus);
+    checkUnnamed710(o.errors);
+    checkUnnamed711(o.rowStatus);
   }
   buildCounterUploadStatus--;
 }
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index 12b90e8..d012909 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -45,27 +45,27 @@
   buildCounterAvailability--;
 }
 
-buildUnnamed114() {
+buildUnnamed742() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed114(core.List<api.CustomDimension> o) {
+checkUnnamed742(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
 }
 
-buildUnnamed115() {
+buildUnnamed743() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed115(core.List<api.CustomMetric> o) {
+checkUnnamed743(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -87,8 +87,8 @@
     o.conversionTimestamp = "foo";
     o.criterionId = "foo";
     o.currencyCode = "foo";
-    o.customDimension = buildUnnamed114();
-    o.customMetric = buildUnnamed115();
+    o.customDimension = buildUnnamed742();
+    o.customMetric = buildUnnamed743();
     o.dsConversionId = "foo";
     o.engineAccountId = "foo";
     o.floodlightOrderId = "foo";
@@ -118,8 +118,8 @@
     unittest.expect(o.conversionTimestamp, unittest.equals('foo'));
     unittest.expect(o.criterionId, unittest.equals('foo'));
     unittest.expect(o.currencyCode, unittest.equals('foo'));
-    checkUnnamed114(o.customDimension);
-    checkUnnamed115(o.customMetric);
+    checkUnnamed742(o.customDimension);
+    checkUnnamed743(o.customMetric);
     unittest.expect(o.dsConversionId, unittest.equals('foo'));
     unittest.expect(o.engineAccountId, unittest.equals('foo'));
     unittest.expect(o.floodlightOrderId, unittest.equals('foo'));
@@ -134,14 +134,14 @@
   buildCounterConversion--;
 }
 
-buildUnnamed116() {
+buildUnnamed744() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed116(core.List<api.Conversion> o) {
+checkUnnamed744(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.ConversionList();
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    o.conversion = buildUnnamed116();
+    o.conversion = buildUnnamed744();
     o.kind = "foo";
   }
   buildCounterConversionList--;
@@ -162,7 +162,7 @@
 checkConversionList(api.ConversionList o) {
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    checkUnnamed116(o.conversion);
+    checkUnnamed744(o.conversion);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionList--;
@@ -231,27 +231,27 @@
   buildCounterReportFiles--;
 }
 
-buildUnnamed117() {
+buildUnnamed745() {
   var o = new core.List<api.ReportFiles>();
   o.add(buildReportFiles());
   o.add(buildReportFiles());
   return o;
 }
 
-checkUnnamed117(core.List<api.ReportFiles> o) {
+checkUnnamed745(core.List<api.ReportFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportFiles(o[0]);
   checkReportFiles(o[1]);
 }
 
-buildUnnamed118() {
+buildUnnamed746() {
   var o = new core.List<api.ReportRow>();
   o.add(buildReportRow());
   o.add(buildReportRow());
   return o;
 }
 
-checkUnnamed118(core.List<api.ReportRow> o) {
+checkUnnamed746(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRow(o[0]);
   checkReportRow(o[1]);
@@ -262,13 +262,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.files = buildUnnamed117();
+    o.files = buildUnnamed745();
     o.id = "foo";
     o.isReportReady = true;
     o.kind = "foo";
     o.request = buildReportRequest();
     o.rowCount = 42;
-    o.rows = buildUnnamed118();
+    o.rows = buildUnnamed746();
     o.statisticsCurrencyCode = "foo";
     o.statisticsTimeZone = "foo";
   }
@@ -279,13 +279,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed117(o.files);
+    checkUnnamed745(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isReportReady, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkReportRequest(o.request);
     unittest.expect(o.rowCount, unittest.equals(42));
-    checkUnnamed118(o.rows);
+    checkUnnamed746(o.rows);
     unittest.expect(o.statisticsCurrencyCode, unittest.equals('foo'));
     unittest.expect(o.statisticsTimeZone, unittest.equals('foo'));
   }
@@ -327,27 +327,27 @@
   buildCounterReportApiColumnSpec--;
 }
 
-buildUnnamed119() {
+buildUnnamed747() {
   var o = new core.List<api.ReportApiColumnSpec>();
   o.add(buildReportApiColumnSpec());
   o.add(buildReportApiColumnSpec());
   return o;
 }
 
-checkUnnamed119(core.List<api.ReportApiColumnSpec> o) {
+checkUnnamed747(core.List<api.ReportApiColumnSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportApiColumnSpec(o[0]);
   checkReportApiColumnSpec(o[1]);
 }
 
-buildUnnamed120() {
+buildUnnamed748() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed120(core.List<core.Object> o) {
+checkUnnamed748(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -360,7 +360,7 @@
   if (buildCounterReportRequestFilters < 3) {
     o.column = buildReportApiColumnSpec();
     o.operator = "foo";
-    o.values = buildUnnamed120();
+    o.values = buildUnnamed748();
   }
   buildCounterReportRequestFilters--;
   return o;
@@ -371,19 +371,19 @@
   if (buildCounterReportRequestFilters < 3) {
     checkReportApiColumnSpec(o.column);
     unittest.expect(o.operator, unittest.equals('foo'));
-    checkUnnamed120(o.values);
+    checkUnnamed748(o.values);
   }
   buildCounterReportRequestFilters--;
 }
 
-buildUnnamed121() {
+buildUnnamed749() {
   var o = new core.List<api.ReportRequestFilters>();
   o.add(buildReportRequestFilters());
   o.add(buildReportRequestFilters());
   return o;
 }
 
-checkUnnamed121(core.List<api.ReportRequestFilters> o) {
+checkUnnamed749(core.List<api.ReportRequestFilters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestFilters(o[0]);
   checkReportRequestFilters(o[1]);
@@ -410,14 +410,14 @@
   buildCounterReportRequestOrderBy--;
 }
 
-buildUnnamed122() {
+buildUnnamed750() {
   var o = new core.List<api.ReportRequestOrderBy>();
   o.add(buildReportRequestOrderBy());
   o.add(buildReportRequestOrderBy());
   return o;
 }
 
-checkUnnamed122(core.List<api.ReportRequestOrderBy> o) {
+checkUnnamed750(core.List<api.ReportRequestOrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestOrderBy(o[0]);
   checkReportRequestOrderBy(o[1]);
@@ -484,13 +484,13 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.columns = buildUnnamed119();
+    o.columns = buildUnnamed747();
     o.downloadFormat = "foo";
-    o.filters = buildUnnamed121();
+    o.filters = buildUnnamed749();
     o.includeDeletedEntities = true;
     o.includeRemovedEntities = true;
     o.maxRowsPerFile = 42;
-    o.orderBy = buildUnnamed122();
+    o.orderBy = buildUnnamed750();
     o.reportScope = buildReportRequestReportScope();
     o.reportType = "foo";
     o.rowCount = 42;
@@ -506,13 +506,13 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed119(o.columns);
+    checkUnnamed747(o.columns);
     unittest.expect(o.downloadFormat, unittest.equals('foo'));
-    checkUnnamed121(o.filters);
+    checkUnnamed749(o.filters);
     unittest.expect(o.includeDeletedEntities, unittest.isTrue);
     unittest.expect(o.includeRemovedEntities, unittest.isTrue);
     unittest.expect(o.maxRowsPerFile, unittest.equals(42));
-    checkUnnamed122(o.orderBy);
+    checkUnnamed750(o.orderBy);
     checkReportRequestReportScope(o.reportScope);
     unittest.expect(o.reportType, unittest.equals('foo'));
     unittest.expect(o.rowCount, unittest.equals(42));
@@ -560,14 +560,14 @@
   buildCounterSavedColumn--;
 }
 
-buildUnnamed123() {
+buildUnnamed751() {
   var o = new core.List<api.SavedColumn>();
   o.add(buildSavedColumn());
   o.add(buildSavedColumn());
   return o;
 }
 
-checkUnnamed123(core.List<api.SavedColumn> o) {
+checkUnnamed751(core.List<api.SavedColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedColumn(o[0]);
   checkSavedColumn(o[1]);
@@ -578,7 +578,7 @@
   var o = new api.SavedColumnList();
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    o.items = buildUnnamed123();
+    o.items = buildUnnamed751();
     o.kind = "foo";
   }
   buildCounterSavedColumnList--;
@@ -588,20 +588,20 @@
 checkSavedColumnList(api.SavedColumnList o) {
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    checkUnnamed123(o.items);
+    checkUnnamed751(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSavedColumnList--;
 }
 
-buildUnnamed124() {
+buildUnnamed752() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed124(core.List<api.Availability> o) {
+checkUnnamed752(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -612,7 +612,7 @@
   var o = new api.UpdateAvailabilityRequest();
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    o.availabilities = buildUnnamed124();
+    o.availabilities = buildUnnamed752();
   }
   buildCounterUpdateAvailabilityRequest--;
   return o;
@@ -621,19 +621,19 @@
 checkUpdateAvailabilityRequest(api.UpdateAvailabilityRequest o) {
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    checkUnnamed124(o.availabilities);
+    checkUnnamed752(o.availabilities);
   }
   buildCounterUpdateAvailabilityRequest--;
 }
 
-buildUnnamed125() {
+buildUnnamed753() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed125(core.List<api.Availability> o) {
+checkUnnamed753(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -644,7 +644,7 @@
   var o = new api.UpdateAvailabilityResponse();
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    o.availabilities = buildUnnamed125();
+    o.availabilities = buildUnnamed753();
   }
   buildCounterUpdateAvailabilityResponse--;
   return o;
@@ -653,7 +653,7 @@
 checkUpdateAvailabilityResponse(api.UpdateAvailabilityResponse o) {
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    checkUnnamed125(o.availabilities);
+    checkUnnamed753(o.availabilities);
   }
   buildCounterUpdateAvailabilityResponse--;
 }
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index b291457..901e62a 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1071() {
+buildUnnamed400() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1071(core.List<core.String> o) {
+checkUnnamed400(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AboutAdditionalRoleInfoRoleSets();
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    o.additionalRoles = buildUnnamed1071();
+    o.additionalRoles = buildUnnamed400();
     o.primaryRole = "foo";
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
@@ -44,20 +44,20 @@
 checkAboutAdditionalRoleInfoRoleSets(api.AboutAdditionalRoleInfoRoleSets o) {
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    checkUnnamed1071(o.additionalRoles);
+    checkUnnamed400(o.additionalRoles);
     unittest.expect(o.primaryRole, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
 }
 
-buildUnnamed1072() {
+buildUnnamed401() {
   var o = new core.List<api.AboutAdditionalRoleInfoRoleSets>();
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   return o;
 }
 
-checkUnnamed1072(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
+checkUnnamed401(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfoRoleSets(o[0]);
   checkAboutAdditionalRoleInfoRoleSets(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.AboutAdditionalRoleInfo();
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    o.roleSets = buildUnnamed1072();
+    o.roleSets = buildUnnamed401();
     o.type = "foo";
   }
   buildCounterAboutAdditionalRoleInfo--;
@@ -78,33 +78,33 @@
 checkAboutAdditionalRoleInfo(api.AboutAdditionalRoleInfo o) {
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    checkUnnamed1072(o.roleSets);
+    checkUnnamed401(o.roleSets);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfo--;
 }
 
-buildUnnamed1073() {
+buildUnnamed402() {
   var o = new core.List<api.AboutAdditionalRoleInfo>();
   o.add(buildAboutAdditionalRoleInfo());
   o.add(buildAboutAdditionalRoleInfo());
   return o;
 }
 
-checkUnnamed1073(core.List<api.AboutAdditionalRoleInfo> o) {
+checkUnnamed402(core.List<api.AboutAdditionalRoleInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfo(o[0]);
   checkAboutAdditionalRoleInfo(o[1]);
 }
 
-buildUnnamed1074() {
+buildUnnamed403() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1074(core.List<core.String> o) {
+checkUnnamed403(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -116,7 +116,7 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed1074();
+    o.targets = buildUnnamed403();
   }
   buildCounterAboutExportFormats--;
   return o;
@@ -126,19 +126,19 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed1074(o.targets);
+    checkUnnamed403(o.targets);
   }
   buildCounterAboutExportFormats--;
 }
 
-buildUnnamed1075() {
+buildUnnamed404() {
   var o = new core.List<api.AboutExportFormats>();
   o.add(buildAboutExportFormats());
   o.add(buildAboutExportFormats());
   return o;
 }
 
-checkUnnamed1075(core.List<api.AboutExportFormats> o) {
+checkUnnamed404(core.List<api.AboutExportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutExportFormats(o[0]);
   checkAboutExportFormats(o[1]);
@@ -165,27 +165,27 @@
   buildCounterAboutFeatures--;
 }
 
-buildUnnamed1076() {
+buildUnnamed405() {
   var o = new core.List<api.AboutFeatures>();
   o.add(buildAboutFeatures());
   o.add(buildAboutFeatures());
   return o;
 }
 
-checkUnnamed1076(core.List<api.AboutFeatures> o) {
+checkUnnamed405(core.List<api.AboutFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutFeatures(o[0]);
   checkAboutFeatures(o[1]);
 }
 
-buildUnnamed1077() {
+buildUnnamed406() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1077(core.List<core.String> o) {
+checkUnnamed406(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -197,7 +197,7 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed1077();
+    o.targets = buildUnnamed406();
   }
   buildCounterAboutImportFormats--;
   return o;
@@ -207,19 +207,19 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed1077(o.targets);
+    checkUnnamed406(o.targets);
   }
   buildCounterAboutImportFormats--;
 }
 
-buildUnnamed1078() {
+buildUnnamed407() {
   var o = new core.List<api.AboutImportFormats>();
   o.add(buildAboutImportFormats());
   o.add(buildAboutImportFormats());
   return o;
 }
 
-checkUnnamed1078(core.List<api.AboutImportFormats> o) {
+checkUnnamed407(core.List<api.AboutImportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutImportFormats(o[0]);
   checkAboutImportFormats(o[1]);
@@ -246,14 +246,14 @@
   buildCounterAboutMaxUploadSizes--;
 }
 
-buildUnnamed1079() {
+buildUnnamed408() {
   var o = new core.List<api.AboutMaxUploadSizes>();
   o.add(buildAboutMaxUploadSizes());
   o.add(buildAboutMaxUploadSizes());
   return o;
 }
 
-checkUnnamed1079(core.List<api.AboutMaxUploadSizes> o) {
+checkUnnamed408(core.List<api.AboutMaxUploadSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutMaxUploadSizes(o[0]);
   checkAboutMaxUploadSizes(o[1]);
@@ -280,14 +280,14 @@
   buildCounterAboutQuotaBytesByService--;
 }
 
-buildUnnamed1080() {
+buildUnnamed409() {
   var o = new core.List<api.AboutQuotaBytesByService>();
   o.add(buildAboutQuotaBytesByService());
   o.add(buildAboutQuotaBytesByService());
   return o;
 }
 
-checkUnnamed1080(core.List<api.AboutQuotaBytesByService> o) {
+checkUnnamed409(core.List<api.AboutQuotaBytesByService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutQuotaBytesByService(o[0]);
   checkAboutQuotaBytesByService(o[1]);
@@ -298,20 +298,20 @@
   var o = new api.About();
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    o.additionalRoleInfo = buildUnnamed1073();
+    o.additionalRoleInfo = buildUnnamed402();
     o.domainSharingPolicy = "foo";
     o.etag = "foo";
-    o.exportFormats = buildUnnamed1075();
-    o.features = buildUnnamed1076();
-    o.importFormats = buildUnnamed1078();
+    o.exportFormats = buildUnnamed404();
+    o.features = buildUnnamed405();
+    o.importFormats = buildUnnamed407();
     o.isCurrentAppInstalled = true;
     o.kind = "foo";
     o.languageCode = "foo";
     o.largestChangeId = "foo";
-    o.maxUploadSizes = buildUnnamed1079();
+    o.maxUploadSizes = buildUnnamed408();
     o.name = "foo";
     o.permissionId = "foo";
-    o.quotaBytesByService = buildUnnamed1080();
+    o.quotaBytesByService = buildUnnamed409();
     o.quotaBytesTotal = "foo";
     o.quotaBytesUsed = "foo";
     o.quotaBytesUsedAggregate = "foo";
@@ -329,20 +329,20 @@
 checkAbout(api.About o) {
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    checkUnnamed1073(o.additionalRoleInfo);
+    checkUnnamed402(o.additionalRoleInfo);
     unittest.expect(o.domainSharingPolicy, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1075(o.exportFormats);
-    checkUnnamed1076(o.features);
-    checkUnnamed1078(o.importFormats);
+    checkUnnamed404(o.exportFormats);
+    checkUnnamed405(o.features);
+    checkUnnamed407(o.importFormats);
     unittest.expect(o.isCurrentAppInstalled, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
-    checkUnnamed1079(o.maxUploadSizes);
+    checkUnnamed408(o.maxUploadSizes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
-    checkUnnamed1080(o.quotaBytesByService);
+    checkUnnamed409(o.quotaBytesByService);
     unittest.expect(o.quotaBytesTotal, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsedAggregate, unittest.equals('foo'));
@@ -379,66 +379,66 @@
   buildCounterAppIcons--;
 }
 
-buildUnnamed1081() {
+buildUnnamed410() {
   var o = new core.List<api.AppIcons>();
   o.add(buildAppIcons());
   o.add(buildAppIcons());
   return o;
 }
 
-checkUnnamed1081(core.List<api.AppIcons> o) {
+checkUnnamed410(core.List<api.AppIcons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppIcons(o[0]);
   checkAppIcons(o[1]);
 }
 
-buildUnnamed1082() {
+buildUnnamed411() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1082(core.List<core.String> o) {
+checkUnnamed411(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1083() {
+buildUnnamed412() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1083(core.List<core.String> o) {
+checkUnnamed412(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1084() {
+buildUnnamed413() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1084(core.List<core.String> o) {
+checkUnnamed413(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1085() {
+buildUnnamed414() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1085(core.List<core.String> o) {
+checkUnnamed414(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -453,7 +453,7 @@
     o.createInFolderTemplate = "foo";
     o.createUrl = "foo";
     o.hasDriveWideScope = true;
-    o.icons = buildUnnamed1081();
+    o.icons = buildUnnamed410();
     o.id = "foo";
     o.installed = true;
     o.kind = "foo";
@@ -461,12 +461,12 @@
     o.name = "foo";
     o.objectType = "foo";
     o.openUrlTemplate = "foo";
-    o.primaryFileExtensions = buildUnnamed1082();
-    o.primaryMimeTypes = buildUnnamed1083();
+    o.primaryFileExtensions = buildUnnamed411();
+    o.primaryMimeTypes = buildUnnamed412();
     o.productId = "foo";
     o.productUrl = "foo";
-    o.secondaryFileExtensions = buildUnnamed1084();
-    o.secondaryMimeTypes = buildUnnamed1085();
+    o.secondaryFileExtensions = buildUnnamed413();
+    o.secondaryMimeTypes = buildUnnamed414();
     o.shortDescription = "foo";
     o.supportsCreate = true;
     o.supportsImport = true;
@@ -485,7 +485,7 @@
     unittest.expect(o.createInFolderTemplate, unittest.equals('foo'));
     unittest.expect(o.createUrl, unittest.equals('foo'));
     unittest.expect(o.hasDriveWideScope, unittest.isTrue);
-    checkUnnamed1081(o.icons);
+    checkUnnamed410(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.installed, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -493,12 +493,12 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.openUrlTemplate, unittest.equals('foo'));
-    checkUnnamed1082(o.primaryFileExtensions);
-    checkUnnamed1083(o.primaryMimeTypes);
+    checkUnnamed411(o.primaryFileExtensions);
+    checkUnnamed412(o.primaryMimeTypes);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productUrl, unittest.equals('foo'));
-    checkUnnamed1084(o.secondaryFileExtensions);
-    checkUnnamed1085(o.secondaryMimeTypes);
+    checkUnnamed413(o.secondaryFileExtensions);
+    checkUnnamed414(o.secondaryMimeTypes);
     unittest.expect(o.shortDescription, unittest.equals('foo'));
     unittest.expect(o.supportsCreate, unittest.isTrue);
     unittest.expect(o.supportsImport, unittest.isTrue);
@@ -509,27 +509,27 @@
   buildCounterApp--;
 }
 
-buildUnnamed1086() {
+buildUnnamed415() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1086(core.List<core.String> o) {
+checkUnnamed415(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1087() {
+buildUnnamed416() {
   var o = new core.List<api.App>();
   o.add(buildApp());
   o.add(buildApp());
   return o;
 }
 
-checkUnnamed1087(core.List<api.App> o) {
+checkUnnamed416(core.List<api.App> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApp(o[0]);
   checkApp(o[1]);
@@ -540,9 +540,9 @@
   var o = new api.AppList();
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    o.defaultAppIds = buildUnnamed1086();
+    o.defaultAppIds = buildUnnamed415();
     o.etag = "foo";
-    o.items = buildUnnamed1087();
+    o.items = buildUnnamed416();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -553,9 +553,9 @@
 checkAppList(api.AppList o) {
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    checkUnnamed1086(o.defaultAppIds);
+    checkUnnamed415(o.defaultAppIds);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1087(o.items);
+    checkUnnamed416(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -593,14 +593,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed1088() {
+buildUnnamed417() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed1088(core.List<api.Change> o) {
+checkUnnamed417(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -612,7 +612,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1088();
+    o.items = buildUnnamed417();
     o.kind = "foo";
     o.largestChangeId = "foo";
     o.nextLink = "foo";
@@ -627,7 +627,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1088(o.items);
+    checkUnnamed417(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -637,14 +637,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed1089() {
+buildUnnamed418() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1089(core.Map<core.String, core.String> o) {
+checkUnnamed418(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -659,7 +659,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed1089();
+    o.params = buildUnnamed418();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -677,7 +677,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1089(o.params);
+    checkUnnamed418(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -687,14 +687,14 @@
   buildCounterChannel--;
 }
 
-buildUnnamed1090() {
+buildUnnamed419() {
   var o = new core.List<api.ChildReference>();
   o.add(buildChildReference());
   o.add(buildChildReference());
   return o;
 }
 
-checkUnnamed1090(core.List<api.ChildReference> o) {
+checkUnnamed419(core.List<api.ChildReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildReference(o[0]);
   checkChildReference(o[1]);
@@ -706,7 +706,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1090();
+    o.items = buildUnnamed419();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -720,7 +720,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1090(o.items);
+    checkUnnamed419(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -775,14 +775,14 @@
   buildCounterCommentContext--;
 }
 
-buildUnnamed1091() {
+buildUnnamed420() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed1091(core.List<api.CommentReply> o) {
+checkUnnamed420(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -805,7 +805,7 @@
     o.htmlContent = "foo";
     o.kind = "foo";
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.replies = buildUnnamed1091();
+    o.replies = buildUnnamed420();
     o.selfLink = "foo";
     o.status = "foo";
   }
@@ -828,21 +828,21 @@
     unittest.expect(o.htmlContent, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1091(o.replies);
+    checkUnnamed420(o.replies);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterComment--;
 }
 
-buildUnnamed1092() {
+buildUnnamed421() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed1092(core.List<api.Comment> o) {
+checkUnnamed421(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -853,7 +853,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed1092();
+    o.items = buildUnnamed421();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -866,7 +866,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed1092(o.items);
+    checkUnnamed421(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -910,14 +910,14 @@
   buildCounterCommentReply--;
 }
 
-buildUnnamed1093() {
+buildUnnamed422() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed1093(core.List<api.CommentReply> o) {
+checkUnnamed422(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -928,7 +928,7 @@
   var o = new api.CommentReplyList();
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    o.items = buildUnnamed1093();
+    o.items = buildUnnamed422();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -941,7 +941,7 @@
 checkCommentReplyList(api.CommentReplyList o) {
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    checkUnnamed1093(o.items);
+    checkUnnamed422(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -950,14 +950,14 @@
   buildCounterCommentReplyList--;
 }
 
-buildUnnamed1094() {
+buildUnnamed423() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1094(core.Map<core.String, core.String> o) {
+checkUnnamed423(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1091,79 +1091,79 @@
   buildCounterFileLabels--;
 }
 
-buildUnnamed1095() {
+buildUnnamed424() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1095(core.Map<core.String, core.String> o) {
+checkUnnamed424(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed1096() {
+buildUnnamed425() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1096(core.List<core.String> o) {
+checkUnnamed425(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1097() {
+buildUnnamed426() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed1097(core.List<api.User> o) {
+checkUnnamed426(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed1098() {
+buildUnnamed427() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed1098(core.List<api.ParentReference> o) {
+checkUnnamed427(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
 }
 
-buildUnnamed1099() {
+buildUnnamed428() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1099(core.List<api.Permission> o) {
+checkUnnamed428(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed1100() {
+buildUnnamed429() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed1100(core.List<api.Property> o) {
+checkUnnamed429(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1229,7 +1229,7 @@
     o.embedLink = "foo";
     o.etag = "foo";
     o.explicitlyTrashed = true;
-    o.exportLinks = buildUnnamed1094();
+    o.exportLinks = buildUnnamed423();
     o.fileExtension = "foo";
     o.fileSize = "foo";
     o.headRevisionId = "foo";
@@ -1247,13 +1247,13 @@
     o.mimeType = "foo";
     o.modifiedByMeDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.openWithLinks = buildUnnamed1095();
+    o.openWithLinks = buildUnnamed424();
     o.originalFilename = "foo";
-    o.ownerNames = buildUnnamed1096();
-    o.owners = buildUnnamed1097();
-    o.parents = buildUnnamed1098();
-    o.permissions = buildUnnamed1099();
-    o.properties = buildUnnamed1100();
+    o.ownerNames = buildUnnamed425();
+    o.owners = buildUnnamed426();
+    o.parents = buildUnnamed427();
+    o.permissions = buildUnnamed428();
+    o.properties = buildUnnamed429();
     o.quotaBytesUsed = "foo";
     o.selfLink = "foo";
     o.shared = true;
@@ -1287,7 +1287,7 @@
     unittest.expect(o.embedLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.explicitlyTrashed, unittest.isTrue);
-    checkUnnamed1094(o.exportLinks);
+    checkUnnamed423(o.exportLinks);
     unittest.expect(o.fileExtension, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.headRevisionId, unittest.equals('foo'));
@@ -1305,13 +1305,13 @@
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.modifiedByMeDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1095(o.openWithLinks);
+    checkUnnamed424(o.openWithLinks);
     unittest.expect(o.originalFilename, unittest.equals('foo'));
-    checkUnnamed1096(o.ownerNames);
-    checkUnnamed1097(o.owners);
-    checkUnnamed1098(o.parents);
-    checkUnnamed1099(o.permissions);
-    checkUnnamed1100(o.properties);
+    checkUnnamed425(o.ownerNames);
+    checkUnnamed426(o.owners);
+    checkUnnamed427(o.parents);
+    checkUnnamed428(o.permissions);
+    checkUnnamed429(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.shared, unittest.isTrue);
@@ -1330,14 +1330,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed1101() {
+buildUnnamed430() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed1101(core.List<api.File> o) {
+checkUnnamed430(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1349,7 +1349,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1101();
+    o.items = buildUnnamed430();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1363,7 +1363,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1101(o.items);
+    checkUnnamed430(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1372,14 +1372,14 @@
   buildCounterFileList--;
 }
 
-buildUnnamed1102() {
+buildUnnamed431() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed1102(core.List<api.ParentReference> o) {
+checkUnnamed431(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
@@ -1391,7 +1391,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1102();
+    o.items = buildUnnamed431();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1403,7 +1403,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1102(o.items);
+    checkUnnamed431(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1437,14 +1437,14 @@
   buildCounterParentReference--;
 }
 
-buildUnnamed1103() {
+buildUnnamed432() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1103(core.List<core.String> o) {
+checkUnnamed432(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1455,7 +1455,7 @@
   var o = new api.Permission();
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    o.additionalRoles = buildUnnamed1103();
+    o.additionalRoles = buildUnnamed432();
     o.authKey = "foo";
     o.domain = "foo";
     o.emailAddress = "foo";
@@ -1477,7 +1477,7 @@
 checkPermission(api.Permission o) {
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    checkUnnamed1103(o.additionalRoles);
+    checkUnnamed432(o.additionalRoles);
     unittest.expect(o.authKey, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.emailAddress, unittest.equals('foo'));
@@ -1516,14 +1516,14 @@
   buildCounterPermissionId--;
 }
 
-buildUnnamed1104() {
+buildUnnamed433() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed1104(core.List<api.Permission> o) {
+checkUnnamed433(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1535,7 +1535,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1104();
+    o.items = buildUnnamed433();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1547,7 +1547,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1104(o.items);
+    checkUnnamed433(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1583,14 +1583,14 @@
   buildCounterProperty--;
 }
 
-buildUnnamed1105() {
+buildUnnamed434() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed1105(core.List<api.Property> o) {
+checkUnnamed434(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1602,7 +1602,7 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1105();
+    o.items = buildUnnamed434();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1614,21 +1614,21 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1105(o.items);
+    checkUnnamed434(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterPropertyList--;
 }
 
-buildUnnamed1106() {
+buildUnnamed435() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1106(core.Map<core.String, core.String> o) {
+checkUnnamed435(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1641,7 +1641,7 @@
   if (buildCounterRevision < 3) {
     o.downloadUrl = "foo";
     o.etag = "foo";
-    o.exportLinks = buildUnnamed1106();
+    o.exportLinks = buildUnnamed435();
     o.fileSize = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -1667,7 +1667,7 @@
   if (buildCounterRevision < 3) {
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1106(o.exportLinks);
+    checkUnnamed435(o.exportLinks);
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1687,14 +1687,14 @@
   buildCounterRevision--;
 }
 
-buildUnnamed1107() {
+buildUnnamed436() {
   var o = new core.List<api.Revision>();
   o.add(buildRevision());
   o.add(buildRevision());
   return o;
 }
 
-checkUnnamed1107(core.List<api.Revision> o) {
+checkUnnamed436(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRevision(o[0]);
   checkRevision(o[1]);
@@ -1706,7 +1706,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1107();
+    o.items = buildUnnamed436();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1718,7 +1718,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1107(o.items);
+    checkUnnamed436(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/freebase/v1_test.dart b/generated/googleapis/test/freebase/v1_test.dart
index 1971e66..9d5ac32 100644
--- a/generated/googleapis/test/freebase/v1_test.dart
+++ b/generated/googleapis/test/freebase/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterReconcileCandidate--;
 }
 
-buildUnnamed1030() {
+buildUnnamed730() {
   var o = new core.List<api.ReconcileCandidate>();
   o.add(buildReconcileCandidate());
   o.add(buildReconcileCandidate());
   return o;
 }
 
-checkUnnamed1030(core.List<api.ReconcileCandidate> o) {
+checkUnnamed730(core.List<api.ReconcileCandidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileCandidate(o[0]);
   checkReconcileCandidate(o[1]);
@@ -121,14 +121,14 @@
   buildCounterReconcileGetWarning--;
 }
 
-buildUnnamed1031() {
+buildUnnamed731() {
   var o = new core.List<api.ReconcileGetWarning>();
   o.add(buildReconcileGetWarning());
   o.add(buildReconcileGetWarning());
   return o;
 }
 
-checkUnnamed1031(core.List<api.ReconcileGetWarning> o) {
+checkUnnamed731(core.List<api.ReconcileGetWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileGetWarning(o[0]);
   checkReconcileGetWarning(o[1]);
@@ -139,10 +139,10 @@
   var o = new api.ReconcileGet();
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    o.candidate = buildUnnamed1030();
+    o.candidate = buildUnnamed730();
     o.costs = buildReconcileGetCosts();
     o.match = buildReconcileCandidate();
-    o.warning = buildUnnamed1031();
+    o.warning = buildUnnamed731();
   }
   buildCounterReconcileGet--;
   return o;
@@ -151,139 +151,139 @@
 checkReconcileGet(api.ReconcileGet o) {
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    checkUnnamed1030(o.candidate);
+    checkUnnamed730(o.candidate);
     checkReconcileGetCosts(o.costs);
     checkReconcileCandidate(o.match);
-    checkUnnamed1031(o.warning);
+    checkUnnamed731(o.warning);
   }
   buildCounterReconcileGet--;
 }
 
-buildUnnamed1032() {
+buildUnnamed732() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1032(core.List<core.String> o) {
+checkUnnamed732(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1033() {
+buildUnnamed733() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1033(core.List<core.String> o) {
+checkUnnamed733(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1034() {
+buildUnnamed734() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1034(core.List<core.String> o) {
+checkUnnamed734(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1035() {
+buildUnnamed735() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1035(core.List<core.String> o) {
+checkUnnamed735(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1036() {
+buildUnnamed736() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1036(core.List<core.String> o) {
+checkUnnamed736(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1037() {
+buildUnnamed737() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1037(core.List<core.String> o) {
+checkUnnamed737(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1038() {
+buildUnnamed738() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1038(core.List<core.String> o) {
+checkUnnamed738(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1039() {
+buildUnnamed739() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1039(core.List<core.String> o) {
+checkUnnamed739(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1040() {
+buildUnnamed740() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1040(core.List<core.String> o) {
+checkUnnamed740(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1041() {
+buildUnnamed741() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1041(core.List<core.String> o) {
+checkUnnamed741(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -342,11 +342,11 @@
       var mock = new common_test.HttpServerMock();
       api.FreebaseApi res = new api.FreebaseApi(mock);
       var arg_confidence = 42.0;
-      var arg_kind = buildUnnamed1032();
-      var arg_lang = buildUnnamed1033();
+      var arg_kind = buildUnnamed732();
+      var arg_lang = buildUnnamed733();
       var arg_limit = 42;
       var arg_name = "foo";
-      var arg_prop = buildUnnamed1034();
+      var arg_prop = buildUnnamed734();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -403,16 +403,16 @@
       var arg_asOfTime = "foo";
       var arg_callback = "foo";
       var arg_cursor = 42;
-      var arg_domain = buildUnnamed1035();
+      var arg_domain = buildUnnamed735();
       var arg_encode = "foo";
       var arg_exact = true;
-      var arg_filter = buildUnnamed1036();
+      var arg_filter = buildUnnamed736();
       var arg_format = "foo";
       var arg_help = "foo";
       var arg_indent = true;
-      var arg_lang = buildUnnamed1037();
+      var arg_lang = buildUnnamed737();
       var arg_limit = 42;
-      var arg_mid = buildUnnamed1038();
+      var arg_mid = buildUnnamed738();
       var arg_mqlOutput = "foo";
       var arg_output = "foo";
       var arg_prefixed = true;
@@ -420,9 +420,9 @@
       var arg_scoring = "foo";
       var arg_spell = "foo";
       var arg_stemmed = true;
-      var arg_type = buildUnnamed1039();
-      var arg_with_ = buildUnnamed1040();
-      var arg_without = buildUnnamed1041();
+      var arg_type = buildUnnamed739();
+      var arg_with_ = buildUnnamed740();
+      var arg_without = buildUnnamed741();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/fusiontables/v1_test.dart b/generated/googleapis/test/fusiontables/v1_test.dart
index cedab47..5c56a20 100644
--- a/generated/googleapis/test/fusiontables/v1_test.dart
+++ b/generated/googleapis/test/fusiontables/v1_test.dart
@@ -97,14 +97,14 @@
   buildCounterColumn--;
 }
 
-buildUnnamed249() {
+buildUnnamed1066() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed249(core.List<api.Column> o) {
+checkUnnamed1066(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -115,7 +115,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed249();
+    o.items = buildUnnamed1066();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -127,7 +127,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed249(o.items);
+    checkUnnamed1066(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -135,14 +135,14 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed250() {
+buildUnnamed1067() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed250(core.List<core.Object> o) {
+checkUnnamed1067(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -153,7 +153,7 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed250();
+    o.geometries = buildUnnamed1067();
     o.geometry = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.type = "foo";
   }
@@ -164,7 +164,7 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed250(o.geometries);
+    checkUnnamed1067(o.geometries);
     var casted3 = (o.geometry) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -192,30 +192,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed251() {
+buildUnnamed1068() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed251(core.List<core.double> o) {
+checkUnnamed1068(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed252() {
+buildUnnamed1069() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed251());
-  o.add(buildUnnamed251());
+  o.add(buildUnnamed1068());
+  o.add(buildUnnamed1068());
   return o;
 }
 
-checkUnnamed252(core.List<core.List<core.double>> o) {
+checkUnnamed1069(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed251(o[0]);
-  checkUnnamed251(o[1]);
+  checkUnnamed1068(o[0]);
+  checkUnnamed1068(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -223,7 +223,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed252();
+    o.coordinates = buildUnnamed1069();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -233,7 +233,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed252(o.coordinates);
+    checkUnnamed1069(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -266,14 +266,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed253() {
+buildUnnamed1070() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed253(core.List<core.double> o) {
+checkUnnamed1070(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -284,7 +284,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed253();
+    o.coordinates = buildUnnamed1070();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -294,7 +294,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed253(o.coordinates);
+    checkUnnamed1070(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -321,43 +321,43 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed254() {
+buildUnnamed1071() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed254(core.List<core.double> o) {
+checkUnnamed1071(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed255() {
+buildUnnamed1072() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed254());
-  o.add(buildUnnamed254());
+  o.add(buildUnnamed1071());
+  o.add(buildUnnamed1071());
   return o;
 }
 
-checkUnnamed255(core.List<core.List<core.double>> o) {
+checkUnnamed1072(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed254(o[0]);
-  checkUnnamed254(o[1]);
+  checkUnnamed1071(o[0]);
+  checkUnnamed1071(o[1]);
 }
 
-buildUnnamed256() {
+buildUnnamed1073() {
   var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed255());
-  o.add(buildUnnamed255());
+  o.add(buildUnnamed1072());
+  o.add(buildUnnamed1072());
   return o;
 }
 
-checkUnnamed256(core.List<core.List<core.List<core.double>>> o) {
+checkUnnamed1073(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed255(o[0]);
-  checkUnnamed255(o[1]);
+  checkUnnamed1072(o[0]);
+  checkUnnamed1072(o[1]);
 }
 
 core.int buildCounterPolygon = 0;
@@ -365,7 +365,7 @@
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed256();
+    o.coordinates = buildUnnamed1073();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -375,7 +375,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed256(o.coordinates);
+    checkUnnamed1073(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -414,43 +414,43 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed257() {
+buildUnnamed1074() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed257(core.List<core.String> o) {
+checkUnnamed1074(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed258() {
+buildUnnamed1075() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed258(core.List<core.Object> o) {
+checkUnnamed1075(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted4 = (o[0]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
   var casted5 = (o[1]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed259() {
+buildUnnamed1076() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed258());
-  o.add(buildUnnamed258());
+  o.add(buildUnnamed1075());
+  o.add(buildUnnamed1075());
   return o;
 }
 
-checkUnnamed259(core.List<core.List<core.Object>> o) {
+checkUnnamed1076(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed258(o[0]);
-  checkUnnamed258(o[1]);
+  checkUnnamed1075(o[0]);
+  checkUnnamed1075(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -458,9 +458,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed257();
+    o.columns = buildUnnamed1074();
     o.kind = "foo";
-    o.rows = buildUnnamed259();
+    o.rows = buildUnnamed1076();
   }
   buildCounterSqlresponse--;
   return o;
@@ -469,21 +469,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed257(o.columns);
+    checkUnnamed1074(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed259(o.rows);
+    checkUnnamed1076(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed260() {
+buildUnnamed1077() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed260(core.List<api.Bucket> o) {
+checkUnnamed1077(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -510,14 +510,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed261() {
+buildUnnamed1078() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed261(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed1078(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -528,7 +528,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed261();
+    o.colors = buildUnnamed1078();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -539,7 +539,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed261(o.colors);
+    checkUnnamed1078(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -551,7 +551,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed260();
+    o.buckets = buildUnnamed1077();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -563,7 +563,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed260(o.buckets);
+    checkUnnamed1077(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -602,14 +602,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed262() {
+buildUnnamed1079() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed262(core.List<api.StyleSetting> o) {
+checkUnnamed1079(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -620,7 +620,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed262();
+    o.items = buildUnnamed1079();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -632,7 +632,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed262(o.items);
+    checkUnnamed1079(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -640,27 +640,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed263() {
+buildUnnamed1080() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed263(core.List<core.String> o) {
+checkUnnamed1080(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed264() {
+buildUnnamed1081() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed264(core.List<api.Column> o) {
+checkUnnamed1081(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -673,8 +673,8 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed263();
-    o.columns = buildUnnamed264();
+    o.baseTableIds = buildUnnamed1080();
+    o.columns = buildUnnamed1081();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -691,8 +691,8 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed263(o.baseTableIds);
-    checkUnnamed264(o.columns);
+    checkUnnamed1080(o.baseTableIds);
+    checkUnnamed1081(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -703,14 +703,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed265() {
+buildUnnamed1082() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed265(core.List<api.Table> o) {
+checkUnnamed1082(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed265();
+    o.items = buildUnnamed1082();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -732,7 +732,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed265(o.items);
+    checkUnnamed1082(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -766,14 +766,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed266() {
+buildUnnamed1083() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed266(core.List<api.Task> o) {
+checkUnnamed1083(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -784,7 +784,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed266();
+    o.items = buildUnnamed1083();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -796,7 +796,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed266(o.items);
+    checkUnnamed1083(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -804,14 +804,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed267() {
+buildUnnamed1084() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed267(core.List<core.String> o) {
+checkUnnamed1084(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -822,7 +822,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed267();
+    o.automaticColumnNames = buildUnnamed1084();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -836,7 +836,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed267(o.automaticColumnNames);
+    checkUnnamed1084(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -846,14 +846,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed268() {
+buildUnnamed1085() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed268(core.List<api.Template> o) {
+checkUnnamed1085(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -864,7 +864,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed268();
+    o.items = buildUnnamed1085();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -876,7 +876,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed268(o.items);
+    checkUnnamed1085(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index 35cc3e7..f5bb3bb 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -59,14 +59,14 @@
   buildCounterAchievementDefinition--;
 }
 
-buildUnnamed465() {
+buildUnnamed20() {
   var o = new core.List<api.AchievementDefinition>();
   o.add(buildAchievementDefinition());
   o.add(buildAchievementDefinition());
   return o;
 }
 
-checkUnnamed465(core.List<api.AchievementDefinition> o) {
+checkUnnamed20(core.List<api.AchievementDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementDefinition(o[0]);
   checkAchievementDefinition(o[1]);
@@ -77,7 +77,7 @@
   var o = new api.AchievementDefinitionsListResponse();
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    o.items = buildUnnamed465();
+    o.items = buildUnnamed20();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -88,7 +88,7 @@
 checkAchievementDefinitionsListResponse(api.AchievementDefinitionsListResponse o) {
   buildCounterAchievementDefinitionsListResponse++;
   if (buildCounterAchievementDefinitionsListResponse < 3) {
-    checkUnnamed465(o.items);
+    checkUnnamed20(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -183,14 +183,14 @@
   buildCounterAchievementUnlockResponse--;
 }
 
-buildUnnamed466() {
+buildUnnamed21() {
   var o = new core.List<api.AchievementUpdateRequest>();
   o.add(buildAchievementUpdateRequest());
   o.add(buildAchievementUpdateRequest());
   return o;
 }
 
-checkUnnamed466(core.List<api.AchievementUpdateRequest> o) {
+checkUnnamed21(core.List<api.AchievementUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateRequest(o[0]);
   checkAchievementUpdateRequest(o[1]);
@@ -202,7 +202,7 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed466();
+    o.updates = buildUnnamed21();
   }
   buildCounterAchievementUpdateMultipleRequest--;
   return o;
@@ -212,19 +212,19 @@
   buildCounterAchievementUpdateMultipleRequest++;
   if (buildCounterAchievementUpdateMultipleRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed466(o.updates);
+    checkUnnamed21(o.updates);
   }
   buildCounterAchievementUpdateMultipleRequest--;
 }
 
-buildUnnamed467() {
+buildUnnamed22() {
   var o = new core.List<api.AchievementUpdateResponse>();
   o.add(buildAchievementUpdateResponse());
   o.add(buildAchievementUpdateResponse());
   return o;
 }
 
-checkUnnamed467(core.List<api.AchievementUpdateResponse> o) {
+checkUnnamed22(core.List<api.AchievementUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementUpdateResponse(o[0]);
   checkAchievementUpdateResponse(o[1]);
@@ -236,7 +236,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     o.kind = "foo";
-    o.updatedAchievements = buildUnnamed467();
+    o.updatedAchievements = buildUnnamed22();
   }
   buildCounterAchievementUpdateMultipleResponse--;
   return o;
@@ -246,7 +246,7 @@
   buildCounterAchievementUpdateMultipleResponse++;
   if (buildCounterAchievementUpdateMultipleResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed467(o.updatedAchievements);
+    checkUnnamed22(o.updatedAchievements);
   }
   buildCounterAchievementUpdateMultipleResponse--;
 }
@@ -357,40 +357,40 @@
   buildCounterAnonymousPlayer--;
 }
 
-buildUnnamed468() {
+buildUnnamed23() {
   var o = new core.List<api.ImageAsset>();
   o.add(buildImageAsset());
   o.add(buildImageAsset());
   return o;
 }
 
-checkUnnamed468(core.List<api.ImageAsset> o) {
+checkUnnamed23(core.List<api.ImageAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImageAsset(o[0]);
   checkImageAsset(o[1]);
 }
 
-buildUnnamed469() {
+buildUnnamed24() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed469(core.List<core.String> o) {
+checkUnnamed24(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed470() {
+buildUnnamed25() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed470(core.List<api.Instance> o) {
+checkUnnamed25(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -402,13 +402,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     o.achievementCount = 42;
-    o.assets = buildUnnamed468();
+    o.assets = buildUnnamed23();
     o.author = "foo";
     o.category = buildApplicationCategory();
     o.description = "foo";
-    o.enabledFeatures = buildUnnamed469();
+    o.enabledFeatures = buildUnnamed24();
     o.id = "foo";
-    o.instances = buildUnnamed470();
+    o.instances = buildUnnamed25();
     o.kind = "foo";
     o.lastUpdatedTimestamp = "foo";
     o.leaderboardCount = 42;
@@ -423,13 +423,13 @@
   buildCounterApplication++;
   if (buildCounterApplication < 3) {
     unittest.expect(o.achievementCount, unittest.equals(42));
-    checkUnnamed468(o.assets);
+    checkUnnamed23(o.assets);
     unittest.expect(o.author, unittest.equals('foo'));
     checkApplicationCategory(o.category);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed469(o.enabledFeatures);
+    checkUnnamed24(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed470(o.instances);
+    checkUnnamed25(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestamp, unittest.equals('foo'));
     unittest.expect(o.leaderboardCount, unittest.equals(42));
@@ -485,14 +485,14 @@
   buildCounterCategory--;
 }
 
-buildUnnamed471() {
+buildUnnamed26() {
   var o = new core.List<api.Category>();
   o.add(buildCategory());
   o.add(buildCategory());
   return o;
 }
 
-checkUnnamed471(core.List<api.Category> o) {
+checkUnnamed26(core.List<api.Category> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCategory(o[0]);
   checkCategory(o[1]);
@@ -503,7 +503,7 @@
   var o = new api.CategoryListResponse();
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    o.items = buildUnnamed471();
+    o.items = buildUnnamed26();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -514,7 +514,7 @@
 checkCategoryListResponse(api.CategoryListResponse o) {
   buildCounterCategoryListResponse++;
   if (buildCounterCategoryListResponse < 3) {
-    checkUnnamed471(o.items);
+    checkUnnamed26(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -565,14 +565,14 @@
   buildCounterEventChild--;
 }
 
-buildUnnamed472() {
+buildUnnamed27() {
   var o = new core.List<api.EventChild>();
   o.add(buildEventChild());
   o.add(buildEventChild());
   return o;
 }
 
-checkUnnamed472(core.List<api.EventChild> o) {
+checkUnnamed27(core.List<api.EventChild> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventChild(o[0]);
   checkEventChild(o[1]);
@@ -583,7 +583,7 @@
   var o = new api.EventDefinition();
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    o.childEvents = buildUnnamed472();
+    o.childEvents = buildUnnamed27();
     o.description = "foo";
     o.displayName = "foo";
     o.id = "foo";
@@ -599,7 +599,7 @@
 checkEventDefinition(api.EventDefinition o) {
   buildCounterEventDefinition++;
   if (buildCounterEventDefinition < 3) {
-    checkUnnamed472(o.childEvents);
+    checkUnnamed27(o.childEvents);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -611,14 +611,14 @@
   buildCounterEventDefinition--;
 }
 
-buildUnnamed473() {
+buildUnnamed28() {
   var o = new core.List<api.EventDefinition>();
   o.add(buildEventDefinition());
   o.add(buildEventDefinition());
   return o;
 }
 
-checkUnnamed473(core.List<api.EventDefinition> o) {
+checkUnnamed28(core.List<api.EventDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventDefinition(o[0]);
   checkEventDefinition(o[1]);
@@ -629,7 +629,7 @@
   var o = new api.EventDefinitionListResponse();
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    o.items = buildUnnamed473();
+    o.items = buildUnnamed28();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -640,7 +640,7 @@
 checkEventDefinitionListResponse(api.EventDefinitionListResponse o) {
   buildCounterEventDefinitionListResponse++;
   if (buildCounterEventDefinitionListResponse < 3) {
-    checkUnnamed473(o.items);
+    checkUnnamed28(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -670,14 +670,14 @@
   buildCounterEventPeriodRange--;
 }
 
-buildUnnamed474() {
+buildUnnamed29() {
   var o = new core.List<api.EventUpdateRequest>();
   o.add(buildEventUpdateRequest());
   o.add(buildEventUpdateRequest());
   return o;
 }
 
-checkUnnamed474(core.List<api.EventUpdateRequest> o) {
+checkUnnamed29(core.List<api.EventUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventUpdateRequest(o[0]);
   checkEventUpdateRequest(o[1]);
@@ -690,7 +690,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     o.kind = "foo";
     o.timePeriod = buildEventPeriodRange();
-    o.updates = buildUnnamed474();
+    o.updates = buildUnnamed29();
   }
   buildCounterEventPeriodUpdate--;
   return o;
@@ -701,7 +701,7 @@
   if (buildCounterEventPeriodUpdate < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     checkEventPeriodRange(o.timePeriod);
-    checkUnnamed474(o.updates);
+    checkUnnamed29(o.updates);
   }
   buildCounterEventPeriodUpdate--;
 }
@@ -729,14 +729,14 @@
   buildCounterEventRecordFailure--;
 }
 
-buildUnnamed475() {
+buildUnnamed30() {
   var o = new core.List<api.EventPeriodUpdate>();
   o.add(buildEventPeriodUpdate());
   o.add(buildEventPeriodUpdate());
   return o;
 }
 
-checkUnnamed475(core.List<api.EventPeriodUpdate> o) {
+checkUnnamed30(core.List<api.EventPeriodUpdate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventPeriodUpdate(o[0]);
   checkEventPeriodUpdate(o[1]);
@@ -750,7 +750,7 @@
     o.currentTimeMillis = "foo";
     o.kind = "foo";
     o.requestId = "foo";
-    o.timePeriods = buildUnnamed475();
+    o.timePeriods = buildUnnamed30();
   }
   buildCounterEventRecordRequest--;
   return o;
@@ -762,7 +762,7 @@
     unittest.expect(o.currentTimeMillis, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed475(o.timePeriods);
+    checkUnnamed30(o.timePeriods);
   }
   buildCounterEventRecordRequest--;
 }
@@ -790,40 +790,40 @@
   buildCounterEventUpdateRequest--;
 }
 
-buildUnnamed476() {
+buildUnnamed31() {
   var o = new core.List<api.EventBatchRecordFailure>();
   o.add(buildEventBatchRecordFailure());
   o.add(buildEventBatchRecordFailure());
   return o;
 }
 
-checkUnnamed476(core.List<api.EventBatchRecordFailure> o) {
+checkUnnamed31(core.List<api.EventBatchRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventBatchRecordFailure(o[0]);
   checkEventBatchRecordFailure(o[1]);
 }
 
-buildUnnamed477() {
+buildUnnamed32() {
   var o = new core.List<api.EventRecordFailure>();
   o.add(buildEventRecordFailure());
   o.add(buildEventRecordFailure());
   return o;
 }
 
-checkUnnamed477(core.List<api.EventRecordFailure> o) {
+checkUnnamed32(core.List<api.EventRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventRecordFailure(o[0]);
   checkEventRecordFailure(o[1]);
 }
 
-buildUnnamed478() {
+buildUnnamed33() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed478(core.List<api.PlayerEvent> o) {
+checkUnnamed33(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -834,10 +834,10 @@
   var o = new api.EventUpdateResponse();
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    o.batchFailures = buildUnnamed476();
-    o.eventFailures = buildUnnamed477();
+    o.batchFailures = buildUnnamed31();
+    o.eventFailures = buildUnnamed32();
     o.kind = "foo";
-    o.playerEvents = buildUnnamed478();
+    o.playerEvents = buildUnnamed33();
   }
   buildCounterEventUpdateResponse--;
   return o;
@@ -846,10 +846,10 @@
 checkEventUpdateResponse(api.EventUpdateResponse o) {
   buildCounterEventUpdateResponse++;
   if (buildCounterEventUpdateResponse < 3) {
-    checkUnnamed476(o.batchFailures);
-    checkUnnamed477(o.eventFailures);
+    checkUnnamed31(o.batchFailures);
+    checkUnnamed32(o.eventFailures);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed478(o.playerEvents);
+    checkUnnamed33(o.playerEvents);
   }
   buildCounterEventUpdateResponse--;
 }
@@ -1103,14 +1103,14 @@
   buildCounterLeaderboardEntry--;
 }
 
-buildUnnamed479() {
+buildUnnamed34() {
   var o = new core.List<api.Leaderboard>();
   o.add(buildLeaderboard());
   o.add(buildLeaderboard());
   return o;
 }
 
-checkUnnamed479(core.List<api.Leaderboard> o) {
+checkUnnamed34(core.List<api.Leaderboard> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboard(o[0]);
   checkLeaderboard(o[1]);
@@ -1121,7 +1121,7 @@
   var o = new api.LeaderboardListResponse();
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    o.items = buildUnnamed479();
+    o.items = buildUnnamed34();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1132,7 +1132,7 @@
 checkLeaderboardListResponse(api.LeaderboardListResponse o) {
   buildCounterLeaderboardListResponse++;
   if (buildCounterLeaderboardListResponse < 3) {
-    checkUnnamed479(o.items);
+    checkUnnamed34(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1166,14 +1166,14 @@
   buildCounterLeaderboardScoreRank--;
 }
 
-buildUnnamed480() {
+buildUnnamed35() {
   var o = new core.List<api.LeaderboardEntry>();
   o.add(buildLeaderboardEntry());
   o.add(buildLeaderboardEntry());
   return o;
 }
 
-checkUnnamed480(core.List<api.LeaderboardEntry> o) {
+checkUnnamed35(core.List<api.LeaderboardEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLeaderboardEntry(o[0]);
   checkLeaderboardEntry(o[1]);
@@ -1184,7 +1184,7 @@
   var o = new api.LeaderboardScores();
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    o.items = buildUnnamed480();
+    o.items = buildUnnamed35();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.numScores = "foo";
@@ -1198,7 +1198,7 @@
 checkLeaderboardScores(api.LeaderboardScores o) {
   buildCounterLeaderboardScores++;
   if (buildCounterLeaderboardScores < 3) {
-    checkUnnamed480(o.items);
+    checkUnnamed35(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.numScores, unittest.equals('foo'));
@@ -1208,14 +1208,14 @@
   buildCounterLeaderboardScores--;
 }
 
-buildUnnamed481() {
+buildUnnamed36() {
   var o = new core.List<api.PlayerLevel>();
   o.add(buildPlayerLevel());
   o.add(buildPlayerLevel());
   return o;
 }
 
-checkUnnamed481(core.List<api.PlayerLevel> o) {
+checkUnnamed36(core.List<api.PlayerLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLevel(o[0]);
   checkPlayerLevel(o[1]);
@@ -1228,7 +1228,7 @@
   if (buildCounterMetagameConfig < 3) {
     o.currentVersion = 42;
     o.kind = "foo";
-    o.playerLevels = buildUnnamed481();
+    o.playerLevels = buildUnnamed36();
   }
   buildCounterMetagameConfig--;
   return o;
@@ -1239,7 +1239,7 @@
   if (buildCounterMetagameConfig < 3) {
     unittest.expect(o.currentVersion, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed481(o.playerLevels);
+    checkUnnamed36(o.playerLevels);
   }
   buildCounterMetagameConfig--;
 }
@@ -1468,14 +1468,14 @@
   buildCounterPlayerAchievement--;
 }
 
-buildUnnamed482() {
+buildUnnamed37() {
   var o = new core.List<api.PlayerAchievement>();
   o.add(buildPlayerAchievement());
   o.add(buildPlayerAchievement());
   return o;
 }
 
-checkUnnamed482(core.List<api.PlayerAchievement> o) {
+checkUnnamed37(core.List<api.PlayerAchievement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerAchievement(o[0]);
   checkPlayerAchievement(o[1]);
@@ -1486,7 +1486,7 @@
   var o = new api.PlayerAchievementListResponse();
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    o.items = buildUnnamed482();
+    o.items = buildUnnamed37();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1497,7 +1497,7 @@
 checkPlayerAchievementListResponse(api.PlayerAchievementListResponse o) {
   buildCounterPlayerAchievementListResponse++;
   if (buildCounterPlayerAchievementListResponse < 3) {
-    checkUnnamed482(o.items);
+    checkUnnamed37(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1531,14 +1531,14 @@
   buildCounterPlayerEvent--;
 }
 
-buildUnnamed483() {
+buildUnnamed38() {
   var o = new core.List<api.PlayerEvent>();
   o.add(buildPlayerEvent());
   o.add(buildPlayerEvent());
   return o;
 }
 
-checkUnnamed483(core.List<api.PlayerEvent> o) {
+checkUnnamed38(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerEvent(o[0]);
   checkPlayerEvent(o[1]);
@@ -1549,7 +1549,7 @@
   var o = new api.PlayerEventListResponse();
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    o.items = buildUnnamed483();
+    o.items = buildUnnamed38();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1560,7 +1560,7 @@
 checkPlayerEventListResponse(api.PlayerEventListResponse o) {
   buildCounterPlayerEventListResponse++;
   if (buildCounterPlayerEventListResponse < 3) {
-    checkUnnamed483(o.items);
+    checkUnnamed38(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1629,14 +1629,14 @@
   buildCounterPlayerLeaderboardScore--;
 }
 
-buildUnnamed484() {
+buildUnnamed39() {
   var o = new core.List<api.PlayerLeaderboardScore>();
   o.add(buildPlayerLeaderboardScore());
   o.add(buildPlayerLeaderboardScore());
   return o;
 }
 
-checkUnnamed484(core.List<api.PlayerLeaderboardScore> o) {
+checkUnnamed39(core.List<api.PlayerLeaderboardScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerLeaderboardScore(o[0]);
   checkPlayerLeaderboardScore(o[1]);
@@ -1647,7 +1647,7 @@
   var o = new api.PlayerLeaderboardScoreListResponse();
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    o.items = buildUnnamed484();
+    o.items = buildUnnamed39();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.player = buildPlayer();
@@ -1659,7 +1659,7 @@
 checkPlayerLeaderboardScoreListResponse(api.PlayerLeaderboardScoreListResponse o) {
   buildCounterPlayerLeaderboardScoreListResponse++;
   if (buildCounterPlayerLeaderboardScoreListResponse < 3) {
-    checkUnnamed484(o.items);
+    checkUnnamed39(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPlayer(o.player);
@@ -1692,14 +1692,14 @@
   buildCounterPlayerLevel--;
 }
 
-buildUnnamed485() {
+buildUnnamed40() {
   var o = new core.List<api.Player>();
   o.add(buildPlayer());
   o.add(buildPlayer());
   return o;
 }
 
-checkUnnamed485(core.List<api.Player> o) {
+checkUnnamed40(core.List<api.Player> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayer(o[0]);
   checkPlayer(o[1]);
@@ -1710,7 +1710,7 @@
   var o = new api.PlayerListResponse();
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    o.items = buildUnnamed485();
+    o.items = buildUnnamed40();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1721,7 +1721,7 @@
 checkPlayerListResponse(api.PlayerListResponse o) {
   buildCounterPlayerListResponse++;
   if (buildCounterPlayerListResponse < 3) {
-    checkUnnamed485(o.items);
+    checkUnnamed40(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1755,14 +1755,14 @@
   buildCounterPlayerScore--;
 }
 
-buildUnnamed486() {
+buildUnnamed41() {
   var o = new core.List<api.PlayerScoreResponse>();
   o.add(buildPlayerScoreResponse());
   o.add(buildPlayerScoreResponse());
   return o;
 }
 
-checkUnnamed486(core.List<api.PlayerScoreResponse> o) {
+checkUnnamed41(core.List<api.PlayerScoreResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScoreResponse(o[0]);
   checkPlayerScoreResponse(o[1]);
@@ -1774,7 +1774,7 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     o.kind = "foo";
-    o.submittedScores = buildUnnamed486();
+    o.submittedScores = buildUnnamed41();
   }
   buildCounterPlayerScoreListResponse--;
   return o;
@@ -1784,32 +1784,32 @@
   buildCounterPlayerScoreListResponse++;
   if (buildCounterPlayerScoreListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed486(o.submittedScores);
+    checkUnnamed41(o.submittedScores);
   }
   buildCounterPlayerScoreListResponse--;
 }
 
-buildUnnamed487() {
+buildUnnamed42() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed487(core.List<core.String> o) {
+checkUnnamed42(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed488() {
+buildUnnamed43() {
   var o = new core.List<api.PlayerScore>();
   o.add(buildPlayerScore());
   o.add(buildPlayerScore());
   return o;
 }
 
-checkUnnamed488(core.List<api.PlayerScore> o) {
+checkUnnamed43(core.List<api.PlayerScore> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlayerScore(o[0]);
   checkPlayerScore(o[1]);
@@ -1820,12 +1820,12 @@
   var o = new api.PlayerScoreResponse();
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    o.beatenScoreTimeSpans = buildUnnamed487();
+    o.beatenScoreTimeSpans = buildUnnamed42();
     o.formattedScore = "foo";
     o.kind = "foo";
     o.leaderboardId = "foo";
     o.scoreTag = "foo";
-    o.unbeatenScores = buildUnnamed488();
+    o.unbeatenScores = buildUnnamed43();
   }
   buildCounterPlayerScoreResponse--;
   return o;
@@ -1834,24 +1834,24 @@
 checkPlayerScoreResponse(api.PlayerScoreResponse o) {
   buildCounterPlayerScoreResponse++;
   if (buildCounterPlayerScoreResponse < 3) {
-    checkUnnamed487(o.beatenScoreTimeSpans);
+    checkUnnamed42(o.beatenScoreTimeSpans);
     unittest.expect(o.formattedScore, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.leaderboardId, unittest.equals('foo'));
     unittest.expect(o.scoreTag, unittest.equals('foo'));
-    checkUnnamed488(o.unbeatenScores);
+    checkUnnamed43(o.unbeatenScores);
   }
   buildCounterPlayerScoreResponse--;
 }
 
-buildUnnamed489() {
+buildUnnamed44() {
   var o = new core.List<api.ScoreSubmission>();
   o.add(buildScoreSubmission());
   o.add(buildScoreSubmission());
   return o;
 }
 
-checkUnnamed489(core.List<api.ScoreSubmission> o) {
+checkUnnamed44(core.List<api.ScoreSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkScoreSubmission(o[0]);
   checkScoreSubmission(o[1]);
@@ -1863,7 +1863,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     o.kind = "foo";
-    o.scores = buildUnnamed489();
+    o.scores = buildUnnamed44();
   }
   buildCounterPlayerScoreSubmissionList--;
   return o;
@@ -1873,7 +1873,7 @@
   buildCounterPlayerScoreSubmissionList++;
   if (buildCounterPlayerScoreSubmissionList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed489(o.scores);
+    checkUnnamed44(o.scores);
   }
   buildCounterPlayerScoreSubmissionList--;
 }
@@ -1945,14 +1945,14 @@
   buildCounterPushTokenId--;
 }
 
-buildUnnamed490() {
+buildUnnamed45() {
   var o = new core.List<api.QuestMilestone>();
   o.add(buildQuestMilestone());
   o.add(buildQuestMilestone());
   return o;
 }
 
-checkUnnamed490(core.List<api.QuestMilestone> o) {
+checkUnnamed45(core.List<api.QuestMilestone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestMilestone(o[0]);
   checkQuestMilestone(o[1]);
@@ -1974,7 +1974,7 @@
     o.isDefaultIconUrl = true;
     o.kind = "foo";
     o.lastUpdatedTimestampMillis = "foo";
-    o.milestones = buildUnnamed490();
+    o.milestones = buildUnnamed45();
     o.name = "foo";
     o.notifyTimestampMillis = "foo";
     o.startTimestampMillis = "foo";
@@ -1998,7 +1998,7 @@
     unittest.expect(o.isDefaultIconUrl, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdatedTimestampMillis, unittest.equals('foo'));
-    checkUnnamed490(o.milestones);
+    checkUnnamed45(o.milestones);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notifyTimestampMillis, unittest.equals('foo'));
     unittest.expect(o.startTimestampMillis, unittest.equals('foo'));
@@ -2057,14 +2057,14 @@
   buildCounterQuestCriterion--;
 }
 
-buildUnnamed491() {
+buildUnnamed46() {
   var o = new core.List<api.Quest>();
   o.add(buildQuest());
   o.add(buildQuest());
   return o;
 }
 
-checkUnnamed491(core.List<api.Quest> o) {
+checkUnnamed46(core.List<api.Quest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuest(o[0]);
   checkQuest(o[1]);
@@ -2075,7 +2075,7 @@
   var o = new api.QuestListResponse();
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    o.items = buildUnnamed491();
+    o.items = buildUnnamed46();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2086,21 +2086,21 @@
 checkQuestListResponse(api.QuestListResponse o) {
   buildCounterQuestListResponse++;
   if (buildCounterQuestListResponse < 3) {
-    checkUnnamed491(o.items);
+    checkUnnamed46(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterQuestListResponse--;
 }
 
-buildUnnamed492() {
+buildUnnamed47() {
   var o = new core.List<api.QuestCriterion>();
   o.add(buildQuestCriterion());
   o.add(buildQuestCriterion());
   return o;
 }
 
-checkUnnamed492(core.List<api.QuestCriterion> o) {
+checkUnnamed47(core.List<api.QuestCriterion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuestCriterion(o[0]);
   checkQuestCriterion(o[1]);
@@ -2112,7 +2112,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     o.completionRewardData = "foo";
-    o.criteria = buildUnnamed492();
+    o.criteria = buildUnnamed47();
     o.id = "foo";
     o.kind = "foo";
     o.state = "foo";
@@ -2125,7 +2125,7 @@
   buildCounterQuestMilestone++;
   if (buildCounterQuestMilestone < 3) {
     unittest.expect(o.completionRewardData, unittest.equals('foo'));
-    checkUnnamed492(o.criteria);
+    checkUnnamed47(o.criteria);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -2156,14 +2156,14 @@
   buildCounterRevisionCheckResponse--;
 }
 
-buildUnnamed493() {
+buildUnnamed48() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed493(core.List<api.RoomParticipant> o) {
+checkUnnamed48(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2182,7 +2182,7 @@
     o.inviterId = "foo";
     o.kind = "foo";
     o.lastUpdateDetails = buildRoomModification();
-    o.participants = buildUnnamed493();
+    o.participants = buildUnnamed48();
     o.roomId = "foo";
     o.roomStatusVersion = 42;
     o.status = "foo";
@@ -2203,7 +2203,7 @@
     unittest.expect(o.inviterId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRoomModification(o.lastUpdateDetails);
-    checkUnnamed493(o.participants);
+    checkUnnamed48(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.roomStatusVersion, unittest.equals(42));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -2279,27 +2279,27 @@
   buildCounterRoomClientAddress--;
 }
 
-buildUnnamed494() {
+buildUnnamed49() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed494(core.List<core.String> o) {
+checkUnnamed49(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed495() {
+buildUnnamed50() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed495(core.List<core.String> o) {
+checkUnnamed50(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2311,9 +2311,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     o.autoMatchingCriteria = buildRoomAutoMatchingCriteria();
-    o.capabilities = buildUnnamed494();
+    o.capabilities = buildUnnamed49();
     o.clientAddress = buildRoomClientAddress();
-    o.invitedPlayerIds = buildUnnamed495();
+    o.invitedPlayerIds = buildUnnamed50();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
     o.requestId = "foo";
@@ -2327,9 +2327,9 @@
   buildCounterRoomCreateRequest++;
   if (buildCounterRoomCreateRequest < 3) {
     checkRoomAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed494(o.capabilities);
+    checkUnnamed49(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
-    checkUnnamed495(o.invitedPlayerIds);
+    checkUnnamed50(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
     unittest.expect(o.requestId, unittest.equals('foo'));
@@ -2338,14 +2338,14 @@
   buildCounterRoomCreateRequest--;
 }
 
-buildUnnamed496() {
+buildUnnamed51() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed496(core.List<core.String> o) {
+checkUnnamed51(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2356,7 +2356,7 @@
   var o = new api.RoomJoinRequest();
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    o.capabilities = buildUnnamed496();
+    o.capabilities = buildUnnamed51();
     o.clientAddress = buildRoomClientAddress();
     o.kind = "foo";
     o.networkDiagnostics = buildNetworkDiagnostics();
@@ -2368,7 +2368,7 @@
 checkRoomJoinRequest(api.RoomJoinRequest o) {
   buildCounterRoomJoinRequest++;
   if (buildCounterRoomJoinRequest < 3) {
-    checkUnnamed496(o.capabilities);
+    checkUnnamed51(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNetworkDiagnostics(o.networkDiagnostics);
@@ -2376,14 +2376,14 @@
   buildCounterRoomJoinRequest--;
 }
 
-buildUnnamed497() {
+buildUnnamed52() {
   var o = new core.List<api.PeerSessionDiagnostics>();
   o.add(buildPeerSessionDiagnostics());
   o.add(buildPeerSessionDiagnostics());
   return o;
 }
 
-checkUnnamed497(core.List<api.PeerSessionDiagnostics> o) {
+checkUnnamed52(core.List<api.PeerSessionDiagnostics> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPeerSessionDiagnostics(o[0]);
   checkPeerSessionDiagnostics(o[1]);
@@ -2400,7 +2400,7 @@
     o.kind = "foo";
     o.networkOperatorCode = "foo";
     o.networkOperatorName = "foo";
-    o.peerSession = buildUnnamed497();
+    o.peerSession = buildUnnamed52();
     o.socketsUsed = true;
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2416,7 +2416,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.networkOperatorCode, unittest.equals('foo'));
     unittest.expect(o.networkOperatorName, unittest.equals('foo'));
-    checkUnnamed497(o.peerSession);
+    checkUnnamed52(o.peerSession);
     unittest.expect(o.socketsUsed, unittest.isTrue);
   }
   buildCounterRoomLeaveDiagnostics--;
@@ -2445,14 +2445,14 @@
   buildCounterRoomLeaveRequest--;
 }
 
-buildUnnamed498() {
+buildUnnamed53() {
   var o = new core.List<api.Room>();
   o.add(buildRoom());
   o.add(buildRoom());
   return o;
 }
 
-checkUnnamed498(core.List<api.Room> o) {
+checkUnnamed53(core.List<api.Room> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoom(o[0]);
   checkRoom(o[1]);
@@ -2463,7 +2463,7 @@
   var o = new api.RoomList();
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    o.items = buildUnnamed498();
+    o.items = buildUnnamed53();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2474,7 +2474,7 @@
 checkRoomList(api.RoomList o) {
   buildCounterRoomList++;
   if (buildCounterRoomList < 3) {
-    checkUnnamed498(o.items);
+    checkUnnamed53(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2535,14 +2535,14 @@
   buildCounterRoomP2PStatus--;
 }
 
-buildUnnamed499() {
+buildUnnamed54() {
   var o = new core.List<api.RoomP2PStatus>();
   o.add(buildRoomP2PStatus());
   o.add(buildRoomP2PStatus());
   return o;
 }
 
-checkUnnamed499(core.List<api.RoomP2PStatus> o) {
+checkUnnamed54(core.List<api.RoomP2PStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomP2PStatus(o[0]);
   checkRoomP2PStatus(o[1]);
@@ -2554,7 +2554,7 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     o.kind = "foo";
-    o.updates = buildUnnamed499();
+    o.updates = buildUnnamed54();
   }
   buildCounterRoomP2PStatuses--;
   return o;
@@ -2564,19 +2564,19 @@
   buildCounterRoomP2PStatuses++;
   if (buildCounterRoomP2PStatuses < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed499(o.updates);
+    checkUnnamed54(o.updates);
   }
   buildCounterRoomP2PStatuses--;
 }
 
-buildUnnamed500() {
+buildUnnamed55() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed500(core.List<core.String> o) {
+checkUnnamed55(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2589,7 +2589,7 @@
   if (buildCounterRoomParticipant < 3) {
     o.autoMatched = true;
     o.autoMatchedPlayer = buildAnonymousPlayer();
-    o.capabilities = buildUnnamed500();
+    o.capabilities = buildUnnamed55();
     o.clientAddress = buildRoomClientAddress();
     o.connected = true;
     o.id = "foo";
@@ -2607,7 +2607,7 @@
   if (buildCounterRoomParticipant < 3) {
     unittest.expect(o.autoMatched, unittest.isTrue);
     checkAnonymousPlayer(o.autoMatchedPlayer);
-    checkUnnamed500(o.capabilities);
+    checkUnnamed55(o.capabilities);
     checkRoomClientAddress(o.clientAddress);
     unittest.expect(o.connected, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2619,14 +2619,14 @@
   buildCounterRoomParticipant--;
 }
 
-buildUnnamed501() {
+buildUnnamed56() {
   var o = new core.List<api.RoomParticipant>();
   o.add(buildRoomParticipant());
   o.add(buildRoomParticipant());
   return o;
 }
 
-checkUnnamed501(core.List<api.RoomParticipant> o) {
+checkUnnamed56(core.List<api.RoomParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoomParticipant(o[0]);
   checkRoomParticipant(o[1]);
@@ -2639,7 +2639,7 @@
   if (buildCounterRoomStatus < 3) {
     o.autoMatchingStatus = buildRoomAutoMatchStatus();
     o.kind = "foo";
-    o.participants = buildUnnamed501();
+    o.participants = buildUnnamed56();
     o.roomId = "foo";
     o.status = "foo";
     o.statusVersion = 42;
@@ -2653,7 +2653,7 @@
   if (buildCounterRoomStatus < 3) {
     checkRoomAutoMatchStatus(o.autoMatchingStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed501(o.participants);
+    checkUnnamed56(o.participants);
     unittest.expect(o.roomId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusVersion, unittest.equals(42));
@@ -2752,14 +2752,14 @@
   buildCounterSnapshotImage--;
 }
 
-buildUnnamed502() {
+buildUnnamed57() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed502(core.List<api.Snapshot> o) {
+checkUnnamed57(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -2770,7 +2770,7 @@
   var o = new api.SnapshotListResponse();
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    o.items = buildUnnamed502();
+    o.items = buildUnnamed57();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -2781,7 +2781,7 @@
 checkSnapshotListResponse(api.SnapshotListResponse o) {
   buildCounterSnapshotListResponse++;
   if (buildCounterSnapshotListResponse < 3) {
-    checkUnnamed502(o.items);
+    checkUnnamed57(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -2813,27 +2813,27 @@
   buildCounterTurnBasedAutoMatchingCriteria--;
 }
 
-buildUnnamed503() {
+buildUnnamed58() {
   var o = new core.List<api.TurnBasedMatchParticipant>();
   o.add(buildTurnBasedMatchParticipant());
   o.add(buildTurnBasedMatchParticipant());
   return o;
 }
 
-checkUnnamed503(core.List<api.TurnBasedMatchParticipant> o) {
+checkUnnamed58(core.List<api.TurnBasedMatchParticipant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatchParticipant(o[0]);
   checkTurnBasedMatchParticipant(o[1]);
 }
 
-buildUnnamed504() {
+buildUnnamed59() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed504(core.List<api.ParticipantResult> o) {
+checkUnnamed59(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -2855,11 +2855,11 @@
     o.matchId = "foo";
     o.matchNumber = 42;
     o.matchVersion = 42;
-    o.participants = buildUnnamed503();
+    o.participants = buildUnnamed58();
     o.pendingParticipantId = "foo";
     o.previousMatchData = buildTurnBasedMatchData();
     o.rematchId = "foo";
-    o.results = buildUnnamed504();
+    o.results = buildUnnamed59();
     o.status = "foo";
     o.userMatchStatus = "foo";
     o.variant = 42;
@@ -2883,11 +2883,11 @@
     unittest.expect(o.matchId, unittest.equals('foo'));
     unittest.expect(o.matchNumber, unittest.equals(42));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed503(o.participants);
+    checkUnnamed58(o.participants);
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
     checkTurnBasedMatchData(o.previousMatchData);
     unittest.expect(o.rematchId, unittest.equals('foo'));
-    checkUnnamed504(o.results);
+    checkUnnamed59(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userMatchStatus, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2896,14 +2896,14 @@
   buildCounterTurnBasedMatch--;
 }
 
-buildUnnamed505() {
+buildUnnamed60() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed505(core.List<core.String> o) {
+checkUnnamed60(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2915,7 +2915,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     o.autoMatchingCriteria = buildTurnBasedAutoMatchingCriteria();
-    o.invitedPlayerIds = buildUnnamed505();
+    o.invitedPlayerIds = buildUnnamed60();
     o.kind = "foo";
     o.requestId = "foo";
     o.variant = 42;
@@ -2928,7 +2928,7 @@
   buildCounterTurnBasedMatchCreateRequest++;
   if (buildCounterTurnBasedMatchCreateRequest < 3) {
     checkTurnBasedAutoMatchingCriteria(o.autoMatchingCriteria);
-    checkUnnamed505(o.invitedPlayerIds);
+    checkUnnamed60(o.invitedPlayerIds);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
     unittest.expect(o.variant, unittest.equals(42));
@@ -2980,14 +2980,14 @@
   buildCounterTurnBasedMatchDataRequest--;
 }
 
-buildUnnamed506() {
+buildUnnamed61() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed506(core.List<api.TurnBasedMatch> o) {
+checkUnnamed61(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -2998,7 +2998,7 @@
   var o = new api.TurnBasedMatchList();
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    o.items = buildUnnamed506();
+    o.items = buildUnnamed61();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -3009,7 +3009,7 @@
 checkTurnBasedMatchList(api.TurnBasedMatchList o) {
   buildCounterTurnBasedMatchList++;
   if (buildCounterTurnBasedMatchList < 3) {
-    checkUnnamed506(o.items);
+    checkUnnamed61(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -3091,14 +3091,14 @@
   buildCounterTurnBasedMatchRematch--;
 }
 
-buildUnnamed507() {
+buildUnnamed62() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed507(core.List<api.ParticipantResult> o) {
+checkUnnamed62(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3112,7 +3112,7 @@
     o.data = buildTurnBasedMatchDataRequest();
     o.kind = "foo";
     o.matchVersion = 42;
-    o.results = buildUnnamed507();
+    o.results = buildUnnamed62();
   }
   buildCounterTurnBasedMatchResults--;
   return o;
@@ -3124,19 +3124,19 @@
     checkTurnBasedMatchDataRequest(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
-    checkUnnamed507(o.results);
+    checkUnnamed62(o.results);
   }
   buildCounterTurnBasedMatchResults--;
 }
 
-buildUnnamed508() {
+buildUnnamed63() {
   var o = new core.List<api.TurnBasedMatch>();
   o.add(buildTurnBasedMatch());
   o.add(buildTurnBasedMatch());
   return o;
 }
 
-checkUnnamed508(core.List<api.TurnBasedMatch> o) {
+checkUnnamed63(core.List<api.TurnBasedMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTurnBasedMatch(o[0]);
   checkTurnBasedMatch(o[1]);
@@ -3147,7 +3147,7 @@
   var o = new api.TurnBasedMatchSync();
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    o.items = buildUnnamed508();
+    o.items = buildUnnamed63();
     o.kind = "foo";
     o.moreAvailable = true;
     o.nextPageToken = "foo";
@@ -3159,7 +3159,7 @@
 checkTurnBasedMatchSync(api.TurnBasedMatchSync o) {
   buildCounterTurnBasedMatchSync++;
   if (buildCounterTurnBasedMatchSync < 3) {
-    checkUnnamed508(o.items);
+    checkUnnamed63(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.moreAvailable, unittest.isTrue);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -3167,14 +3167,14 @@
   buildCounterTurnBasedMatchSync--;
 }
 
-buildUnnamed509() {
+buildUnnamed64() {
   var o = new core.List<api.ParticipantResult>();
   o.add(buildParticipantResult());
   o.add(buildParticipantResult());
   return o;
 }
 
-checkUnnamed509(core.List<api.ParticipantResult> o) {
+checkUnnamed64(core.List<api.ParticipantResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParticipantResult(o[0]);
   checkParticipantResult(o[1]);
@@ -3189,7 +3189,7 @@
     o.kind = "foo";
     o.matchVersion = 42;
     o.pendingParticipantId = "foo";
-    o.results = buildUnnamed509();
+    o.results = buildUnnamed64();
   }
   buildCounterTurnBasedMatchTurn--;
   return o;
@@ -3202,7 +3202,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchVersion, unittest.equals(42));
     unittest.expect(o.pendingParticipantId, unittest.equals('foo'));
-    checkUnnamed509(o.results);
+    checkUnnamed64(o.results);
   }
   buildCounterTurnBasedMatchTurn--;
 }
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index 28c4a76..c2b95d4 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed75() {
+buildUnnamed437() {
   var o = new core.List<api.AchievementResetResponse>();
   o.add(buildAchievementResetResponse());
   o.add(buildAchievementResetResponse());
   return o;
 }
 
-checkUnnamed75(core.List<api.AchievementResetResponse> o) {
+checkUnnamed437(core.List<api.AchievementResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementResetResponse(o[0]);
   checkAchievementResetResponse(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed75();
+    o.results = buildUnnamed437();
   }
   buildCounterAchievementResetAllResponse--;
   return o;
@@ -45,19 +45,19 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed75(o.results);
+    checkUnnamed437(o.results);
   }
   buildCounterAchievementResetAllResponse--;
 }
 
-buildUnnamed76() {
+buildUnnamed438() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed76(core.List<core.String> o) {
+checkUnnamed438(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -68,7 +68,7 @@
   var o = new api.AchievementResetMultipleForAllRequest();
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    o.achievementIds = buildUnnamed76();
+    o.achievementIds = buildUnnamed438();
     o.kind = "foo";
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -78,7 +78,7 @@
 checkAchievementResetMultipleForAllRequest(api.AchievementResetMultipleForAllRequest o) {
   buildCounterAchievementResetMultipleForAllRequest++;
   if (buildCounterAchievementResetMultipleForAllRequest < 3) {
-    checkUnnamed76(o.achievementIds);
+    checkUnnamed438(o.achievementIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAchievementResetMultipleForAllRequest--;
@@ -201,14 +201,14 @@
   buildCounterHiddenPlayer--;
 }
 
-buildUnnamed77() {
+buildUnnamed439() {
   var o = new core.List<api.HiddenPlayer>();
   o.add(buildHiddenPlayer());
   o.add(buildHiddenPlayer());
   return o;
 }
 
-checkUnnamed77(core.List<api.HiddenPlayer> o) {
+checkUnnamed439(core.List<api.HiddenPlayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHiddenPlayer(o[0]);
   checkHiddenPlayer(o[1]);
@@ -219,7 +219,7 @@
   var o = new api.HiddenPlayerList();
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    o.items = buildUnnamed77();
+    o.items = buildUnnamed439();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -230,7 +230,7 @@
 checkHiddenPlayerList(api.HiddenPlayerList o) {
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    checkUnnamed77(o.items);
+    checkUnnamed439(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -291,14 +291,14 @@
   buildCounterPlayer--;
 }
 
-buildUnnamed78() {
+buildUnnamed440() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed78(core.List<core.String> o) {
+checkUnnamed440(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -310,7 +310,7 @@
   buildCounterPlayerScoreResetResponse++;
   if (buildCounterPlayerScoreResetResponse < 3) {
     o.kind = "foo";
-    o.resetScoreTimeSpans = buildUnnamed78();
+    o.resetScoreTimeSpans = buildUnnamed440();
   }
   buildCounterPlayerScoreResetResponse--;
   return o;
@@ -320,7 +320,7 @@
   buildCounterPlayerScoreResetResponse++;
   if (buildCounterPlayerScoreResetResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed78(o.resetScoreTimeSpans);
+    checkUnnamed440(o.resetScoreTimeSpans);
   }
   buildCounterPlayerScoreResetResponse--;
 }
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index bfa0851..cab0c85 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDraft--;
 }
 
-buildUnnamed798() {
+buildUnnamed163() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed798(core.List<api.Message> o) {
+checkUnnamed163(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -56,7 +56,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     o.id = "foo";
-    o.messages = buildUnnamed798();
+    o.messages = buildUnnamed163();
   }
   buildCounterHistory--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed798(o.messages);
+    checkUnnamed163(o.messages);
   }
   buildCounterHistory--;
 }
@@ -106,14 +106,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed799() {
+buildUnnamed164() {
   var o = new core.List<api.Draft>();
   o.add(buildDraft());
   o.add(buildDraft());
   return o;
 }
 
-checkUnnamed799(core.List<api.Draft> o) {
+checkUnnamed164(core.List<api.Draft> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDraft(o[0]);
   checkDraft(o[1]);
@@ -124,7 +124,7 @@
   var o = new api.ListDraftsResponse();
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    o.drafts = buildUnnamed799();
+    o.drafts = buildUnnamed164();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -135,21 +135,21 @@
 checkListDraftsResponse(api.ListDraftsResponse o) {
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    checkUnnamed799(o.drafts);
+    checkUnnamed164(o.drafts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListDraftsResponse--;
 }
 
-buildUnnamed800() {
+buildUnnamed165() {
   var o = new core.List<api.History>();
   o.add(buildHistory());
   o.add(buildHistory());
   return o;
 }
 
-checkUnnamed800(core.List<api.History> o) {
+checkUnnamed165(core.List<api.History> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistory(o[0]);
   checkHistory(o[1]);
@@ -160,7 +160,7 @@
   var o = new api.ListHistoryResponse();
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    o.history = buildUnnamed800();
+    o.history = buildUnnamed165();
     o.historyId = "foo";
     o.nextPageToken = "foo";
   }
@@ -171,21 +171,21 @@
 checkListHistoryResponse(api.ListHistoryResponse o) {
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    checkUnnamed800(o.history);
+    checkUnnamed165(o.history);
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListHistoryResponse--;
 }
 
-buildUnnamed801() {
+buildUnnamed166() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed801(core.List<api.Label> o) {
+checkUnnamed166(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -196,7 +196,7 @@
   var o = new api.ListLabelsResponse();
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    o.labels = buildUnnamed801();
+    o.labels = buildUnnamed166();
   }
   buildCounterListLabelsResponse--;
   return o;
@@ -205,19 +205,19 @@
 checkListLabelsResponse(api.ListLabelsResponse o) {
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    checkUnnamed801(o.labels);
+    checkUnnamed166(o.labels);
   }
   buildCounterListLabelsResponse--;
 }
 
-buildUnnamed802() {
+buildUnnamed167() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed802(core.List<api.Message> o) {
+checkUnnamed167(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -228,7 +228,7 @@
   var o = new api.ListMessagesResponse();
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    o.messages = buildUnnamed802();
+    o.messages = buildUnnamed167();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -239,21 +239,21 @@
 checkListMessagesResponse(api.ListMessagesResponse o) {
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    checkUnnamed802(o.messages);
+    checkUnnamed167(o.messages);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListMessagesResponse--;
 }
 
-buildUnnamed803() {
+buildUnnamed168() {
   var o = new core.List<api.Thread>();
   o.add(buildThread());
   o.add(buildThread());
   return o;
 }
 
-checkUnnamed803(core.List<api.Thread> o) {
+checkUnnamed168(core.List<api.Thread> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThread(o[0]);
   checkThread(o[1]);
@@ -266,7 +266,7 @@
   if (buildCounterListThreadsResponse < 3) {
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
-    o.threads = buildUnnamed803();
+    o.threads = buildUnnamed168();
   }
   buildCounterListThreadsResponse--;
   return o;
@@ -277,19 +277,19 @@
   if (buildCounterListThreadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
-    checkUnnamed803(o.threads);
+    checkUnnamed168(o.threads);
   }
   buildCounterListThreadsResponse--;
 }
 
-buildUnnamed804() {
+buildUnnamed169() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed804(core.List<core.String> o) {
+checkUnnamed169(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -302,7 +302,7 @@
   if (buildCounterMessage < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.labelIds = buildUnnamed804();
+    o.labelIds = buildUnnamed169();
     o.payload = buildMessagePart();
     o.raw = "foo";
     o.sizeEstimate = 42;
@@ -318,7 +318,7 @@
   if (buildCounterMessage < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed804(o.labelIds);
+    checkUnnamed169(o.labelIds);
     checkMessagePart(o.payload);
     unittest.expect(o.raw, unittest.equals('foo'));
     unittest.expect(o.sizeEstimate, unittest.equals(42));
@@ -328,27 +328,27 @@
   buildCounterMessage--;
 }
 
-buildUnnamed805() {
+buildUnnamed170() {
   var o = new core.List<api.MessagePartHeader>();
   o.add(buildMessagePartHeader());
   o.add(buildMessagePartHeader());
   return o;
 }
 
-checkUnnamed805(core.List<api.MessagePartHeader> o) {
+checkUnnamed170(core.List<api.MessagePartHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePartHeader(o[0]);
   checkMessagePartHeader(o[1]);
 }
 
-buildUnnamed806() {
+buildUnnamed171() {
   var o = new core.List<api.MessagePart>();
   o.add(buildMessagePart());
   o.add(buildMessagePart());
   return o;
 }
 
-checkUnnamed806(core.List<api.MessagePart> o) {
+checkUnnamed171(core.List<api.MessagePart> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePart(o[0]);
   checkMessagePart(o[1]);
@@ -361,10 +361,10 @@
   if (buildCounterMessagePart < 3) {
     o.body = buildMessagePartBody();
     o.filename = "foo";
-    o.headers = buildUnnamed805();
+    o.headers = buildUnnamed170();
     o.mimeType = "foo";
     o.partId = "foo";
-    o.parts = buildUnnamed806();
+    o.parts = buildUnnamed171();
   }
   buildCounterMessagePart--;
   return o;
@@ -375,10 +375,10 @@
   if (buildCounterMessagePart < 3) {
     checkMessagePartBody(o.body);
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed805(o.headers);
+    checkUnnamed170(o.headers);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.partId, unittest.equals('foo'));
-    checkUnnamed806(o.parts);
+    checkUnnamed171(o.parts);
   }
   buildCounterMessagePart--;
 }
@@ -427,27 +427,27 @@
   buildCounterMessagePartHeader--;
 }
 
-buildUnnamed807() {
+buildUnnamed172() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed807(core.List<core.String> o) {
+checkUnnamed172(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed808() {
+buildUnnamed173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed808(core.List<core.String> o) {
+checkUnnamed173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -458,8 +458,8 @@
   var o = new api.ModifyMessageRequest();
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    o.addLabelIds = buildUnnamed807();
-    o.removeLabelIds = buildUnnamed808();
+    o.addLabelIds = buildUnnamed172();
+    o.removeLabelIds = buildUnnamed173();
   }
   buildCounterModifyMessageRequest--;
   return o;
@@ -468,33 +468,33 @@
 checkModifyMessageRequest(api.ModifyMessageRequest o) {
   buildCounterModifyMessageRequest++;
   if (buildCounterModifyMessageRequest < 3) {
-    checkUnnamed807(o.addLabelIds);
-    checkUnnamed808(o.removeLabelIds);
+    checkUnnamed172(o.addLabelIds);
+    checkUnnamed173(o.removeLabelIds);
   }
   buildCounterModifyMessageRequest--;
 }
 
-buildUnnamed809() {
+buildUnnamed174() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed809(core.List<core.String> o) {
+checkUnnamed174(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed810() {
+buildUnnamed175() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed810(core.List<core.String> o) {
+checkUnnamed175(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -505,8 +505,8 @@
   var o = new api.ModifyThreadRequest();
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    o.addLabelIds = buildUnnamed809();
-    o.removeLabelIds = buildUnnamed810();
+    o.addLabelIds = buildUnnamed174();
+    o.removeLabelIds = buildUnnamed175();
   }
   buildCounterModifyThreadRequest--;
   return o;
@@ -515,20 +515,45 @@
 checkModifyThreadRequest(api.ModifyThreadRequest o) {
   buildCounterModifyThreadRequest++;
   if (buildCounterModifyThreadRequest < 3) {
-    checkUnnamed809(o.addLabelIds);
-    checkUnnamed810(o.removeLabelIds);
+    checkUnnamed174(o.addLabelIds);
+    checkUnnamed175(o.removeLabelIds);
   }
   buildCounterModifyThreadRequest--;
 }
 
-buildUnnamed811() {
+core.int buildCounterProfile = 0;
+buildProfile() {
+  var o = new api.Profile();
+  buildCounterProfile++;
+  if (buildCounterProfile < 3) {
+    o.emailAddress = "foo";
+    o.historyId = "foo";
+    o.messagesTotal = 42;
+    o.threadsTotal = 42;
+  }
+  buildCounterProfile--;
+  return o;
+}
+
+checkProfile(api.Profile o) {
+  buildCounterProfile++;
+  if (buildCounterProfile < 3) {
+    unittest.expect(o.emailAddress, unittest.equals('foo'));
+    unittest.expect(o.historyId, unittest.equals('foo'));
+    unittest.expect(o.messagesTotal, unittest.equals(42));
+    unittest.expect(o.threadsTotal, unittest.equals(42));
+  }
+  buildCounterProfile--;
+}
+
+buildUnnamed176() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed811(core.List<api.Message> o) {
+checkUnnamed176(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -541,7 +566,7 @@
   if (buildCounterThread < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.messages = buildUnnamed811();
+    o.messages = buildUnnamed176();
     o.snippet = "foo";
   }
   buildCounterThread--;
@@ -553,46 +578,46 @@
   if (buildCounterThread < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed811(o.messages);
+    checkUnnamed176(o.messages);
     unittest.expect(o.snippet, unittest.equals('foo'));
   }
   buildCounterThread--;
 }
 
-buildUnnamed812() {
+buildUnnamed177() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed812(core.List<core.String> o) {
+checkUnnamed177(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed813() {
+buildUnnamed178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed813(core.List<core.String> o) {
+checkUnnamed178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed814() {
+buildUnnamed179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed814(core.List<core.String> o) {
+checkUnnamed179(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -726,6 +751,15 @@
   });
 
 
+  unittest.group("obj-schema-Profile", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildProfile();
+      var od = new api.Profile.fromJson(o.toJson());
+      checkProfile(od);
+    });
+  });
+
+
   unittest.group("obj-schema-Thread", () {
     unittest.test("to-json--from-json", () {
       var o = buildThread();
@@ -735,6 +769,52 @@
   });
 
 
+  unittest.group("resource-UsersResourceApi", () {
+    unittest.test("method--getProfile", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.UsersResourceApi res = new api.GmailApi(mock).users;
+      var arg_userId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildProfile());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.getProfile(arg_userId).then(unittest.expectAsync(((api.Profile response) {
+        checkProfile(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-UsersDraftsResourceApi", () {
     unittest.test("method--create", () {
       // TODO: Implement tests for media upload;
@@ -1389,7 +1469,7 @@
       var arg_userId = "foo";
       var arg_id = "foo";
       var arg_format = "foo";
-      var arg_metadataHeaders = buildUnnamed812();
+      var arg_metadataHeaders = buildUnnamed177();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1535,7 +1615,7 @@
       api.UsersMessagesResourceApi res = new api.GmailApi(mock).users.messages;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed813();
+      var arg_labelIds = buildUnnamed178();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
@@ -1904,7 +1984,7 @@
       api.UsersThreadsResourceApi res = new api.GmailApi(mock).users.threads;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed814();
+      var arg_labelIds = buildUnnamed179();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index 2027c80..d559021 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -64,14 +64,14 @@
   buildCounterDeleteAccountResponse--;
 }
 
-buildUnnamed303() {
+buildUnnamed971() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed303(core.List<api.UserInfo> o) {
+checkUnnamed971(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -84,7 +84,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.users = buildUnnamed303();
+    o.users = buildUnnamed971();
   }
   buildCounterDownloadAccountResponse--;
   return o;
@@ -95,19 +95,19 @@
   if (buildCounterDownloadAccountResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed303(o.users);
+    checkUnnamed971(o.users);
   }
   buildCounterDownloadAccountResponse--;
 }
 
-buildUnnamed304() {
+buildUnnamed972() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed304(core.List<api.UserInfo> o) {
+checkUnnamed972(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -119,7 +119,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     o.kind = "foo";
-    o.users = buildUnnamed304();
+    o.users = buildUnnamed972();
   }
   buildCounterGetAccountInfoResponse--;
   return o;
@@ -129,7 +129,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed304(o.users);
+    checkUnnamed972(o.users);
   }
   buildCounterGetAccountInfoResponse--;
 }
@@ -228,27 +228,27 @@
   buildCounterIdentitytoolkitRelyingpartyDownloadAccountRequest--;
 }
 
-buildUnnamed305() {
+buildUnnamed973() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed305(core.List<core.String> o) {
+checkUnnamed973(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed306() {
+buildUnnamed974() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed306(core.List<core.String> o) {
+checkUnnamed974(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -259,9 +259,9 @@
   var o = new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest();
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    o.email = buildUnnamed305();
+    o.email = buildUnnamed973();
     o.idToken = "foo";
-    o.localId = buildUnnamed306();
+    o.localId = buildUnnamed974();
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
   return o;
@@ -270,9 +270,9 @@
 checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(api.IdentitytoolkitRelyingpartyGetAccountInfoRequest o) {
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    checkUnnamed305(o.email);
+    checkUnnamed973(o.email);
     unittest.expect(o.idToken, unittest.equals('foo'));
-    checkUnnamed306(o.localId);
+    checkUnnamed974(o.localId);
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
 }
@@ -315,14 +315,14 @@
   buildCounterIdentitytoolkitRelyingpartyResetPasswordRequest--;
 }
 
-buildUnnamed307() {
+buildUnnamed975() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed307(core.List<core.String> o) {
+checkUnnamed975(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -342,7 +342,7 @@
     o.localId = "foo";
     o.oobCode = "foo";
     o.password = "foo";
-    o.provider = buildUnnamed307();
+    o.provider = buildUnnamed975();
     o.upgradeToFederatedLogin = true;
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
@@ -361,20 +361,20 @@
     unittest.expect(o.localId, unittest.equals('foo'));
     unittest.expect(o.oobCode, unittest.equals('foo'));
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed307(o.provider);
+    checkUnnamed975(o.provider);
     unittest.expect(o.upgradeToFederatedLogin, unittest.isTrue);
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
 }
 
-buildUnnamed308() {
+buildUnnamed976() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed308(core.List<api.UserInfo> o) {
+checkUnnamed976(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -390,7 +390,7 @@
     o.rounds = 42;
     o.saltSeparator = "foo";
     o.signerKey = "foo";
-    o.users = buildUnnamed308();
+    o.users = buildUnnamed976();
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
   return o;
@@ -404,7 +404,7 @@
     unittest.expect(o.rounds, unittest.equals(42));
     unittest.expect(o.saltSeparator, unittest.equals('foo'));
     unittest.expect(o.signerKey, unittest.equals('foo'));
-    checkUnnamed308(o.users);
+    checkUnnamed976(o.users);
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
 }
@@ -536,14 +536,14 @@
   buildCounterSetAccountInfoResponseProviderUserInfo--;
 }
 
-buildUnnamed309() {
+buildUnnamed977() {
   var o = new core.List<api.SetAccountInfoResponseProviderUserInfo>();
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   return o;
 }
 
-checkUnnamed309(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
+checkUnnamed977(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetAccountInfoResponseProviderUserInfo(o[0]);
   checkSetAccountInfoResponseProviderUserInfo(o[1]);
@@ -558,7 +558,7 @@
     o.email = "foo";
     o.idToken = "foo";
     o.kind = "foo";
-    o.providerUserInfo = buildUnnamed309();
+    o.providerUserInfo = buildUnnamed977();
   }
   buildCounterSetAccountInfoResponse--;
   return o;
@@ -571,7 +571,7 @@
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.idToken, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed309(o.providerUserInfo);
+    checkUnnamed977(o.providerUserInfo);
   }
   buildCounterSetAccountInfoResponse--;
 }
@@ -597,14 +597,14 @@
   buildCounterUploadAccountResponseError--;
 }
 
-buildUnnamed310() {
+buildUnnamed978() {
   var o = new core.List<api.UploadAccountResponseError>();
   o.add(buildUploadAccountResponseError());
   o.add(buildUploadAccountResponseError());
   return o;
 }
 
-checkUnnamed310(core.List<api.UploadAccountResponseError> o) {
+checkUnnamed978(core.List<api.UploadAccountResponseError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUploadAccountResponseError(o[0]);
   checkUploadAccountResponseError(o[1]);
@@ -615,7 +615,7 @@
   var o = new api.UploadAccountResponse();
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    o.error = buildUnnamed310();
+    o.error = buildUnnamed978();
     o.kind = "foo";
   }
   buildCounterUploadAccountResponse--;
@@ -625,7 +625,7 @@
 checkUploadAccountResponse(api.UploadAccountResponse o) {
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    checkUnnamed310(o.error);
+    checkUnnamed978(o.error);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUploadAccountResponse--;
@@ -656,14 +656,14 @@
   buildCounterUserInfoProviderUserInfo--;
 }
 
-buildUnnamed311() {
+buildUnnamed979() {
   var o = new core.List<api.UserInfoProviderUserInfo>();
   o.add(buildUserInfoProviderUserInfo());
   o.add(buildUserInfoProviderUserInfo());
   return o;
 }
 
-checkUnnamed311(core.List<api.UserInfoProviderUserInfo> o) {
+checkUnnamed979(core.List<api.UserInfoProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfoProviderUserInfo(o[0]);
   checkUserInfoProviderUserInfo(o[1]);
@@ -681,7 +681,7 @@
     o.passwordHash = "foo";
     o.passwordUpdatedAt = 42.0;
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed311();
+    o.providerUserInfo = buildUnnamed979();
     o.salt = "foo";
     o.version = 42;
   }
@@ -699,21 +699,21 @@
     unittest.expect(o.passwordHash, unittest.equals('foo'));
     unittest.expect(o.passwordUpdatedAt, unittest.equals(42.0));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed311(o.providerUserInfo);
+    checkUnnamed979(o.providerUserInfo);
     unittest.expect(o.salt, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterUserInfo--;
 }
 
-buildUnnamed312() {
+buildUnnamed980() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed312(core.List<core.String> o) {
+checkUnnamed980(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -750,7 +750,7 @@
     o.photoUrl = "foo";
     o.providerId = "foo";
     o.timeZone = "foo";
-    o.verifiedProvider = buildUnnamed312();
+    o.verifiedProvider = buildUnnamed980();
   }
   buildCounterVerifyAssertionResponse--;
   return o;
@@ -785,7 +785,7 @@
     unittest.expect(o.photoUrl, unittest.equals('foo'));
     unittest.expect(o.providerId, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
-    checkUnnamed312(o.verifiedProvider);
+    checkUnnamed980(o.verifiedProvider);
   }
   buildCounterVerifyAssertionResponse--;
 }
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index a92d63b..722a59d 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterLicenseAssignmentInsert--;
 }
 
-buildUnnamed313() {
+buildUnnamed872() {
   var o = new core.List<api.LicenseAssignment>();
   o.add(buildLicenseAssignment());
   o.add(buildLicenseAssignment());
   return o;
 }
 
-checkUnnamed313(core.List<api.LicenseAssignment> o) {
+checkUnnamed872(core.List<api.LicenseAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLicenseAssignment(o[0]);
   checkLicenseAssignment(o[1]);
@@ -83,7 +83,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed313();
+    o.items = buildUnnamed872();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -95,7 +95,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed313(o.items);
+    checkUnnamed872(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/mapsengine/v1_test.dart b/generated/googleapis/test/mapsengine/v1_test.dart
index 54ce466..ac2f2ce 100644
--- a/generated/googleapis/test/mapsengine/v1_test.dart
+++ b/generated/googleapis/test/mapsengine/v1_test.dart
@@ -39,27 +39,27 @@
   buildCounterAcquisitionTime--;
 }
 
-buildUnnamed333() {
+buildUnnamed91() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed333(core.List<core.double> o) {
+checkUnnamed91(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed334() {
+buildUnnamed92() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed334(core.List<core.String> o) {
+checkUnnamed92(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -70,7 +70,7 @@
   var o = new api.Asset();
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    o.bbox = buildUnnamed333();
+    o.bbox = buildUnnamed91();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
@@ -81,7 +81,7 @@
     o.name = "foo";
     o.projectId = "foo";
     o.resource = "foo";
-    o.tags = buildUnnamed334();
+    o.tags = buildUnnamed92();
     o.type = "foo";
     o.writersCanEditPermissions = true;
   }
@@ -92,7 +92,7 @@
 checkAsset(api.Asset o) {
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    checkUnnamed333(o.bbox);
+    checkUnnamed91(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -103,21 +103,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
-    checkUnnamed334(o.tags);
+    checkUnnamed92(o.tags);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterAsset--;
 }
 
-buildUnnamed335() {
+buildUnnamed93() {
   var o = new core.List<api.Asset>();
   o.add(buildAsset());
   o.add(buildAsset());
   return o;
 }
 
-checkUnnamed335(core.List<api.Asset> o) {
+checkUnnamed93(core.List<api.Asset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsset(o[0]);
   checkAsset(o[1]);
@@ -128,7 +128,7 @@
   var o = new api.AssetsListResponse();
   buildCounterAssetsListResponse++;
   if (buildCounterAssetsListResponse < 3) {
-    o.assets = buildUnnamed335();
+    o.assets = buildUnnamed93();
     o.nextPageToken = "foo";
   }
   buildCounterAssetsListResponse--;
@@ -138,7 +138,7 @@
 checkAssetsListResponse(api.AssetsListResponse o) {
   buildCounterAssetsListResponse++;
   if (buildCounterAssetsListResponse < 3) {
-    checkUnnamed335(o.assets);
+    checkUnnamed93(o.assets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAssetsListResponse--;
@@ -220,14 +220,14 @@
   checkDatasource(o[1]);
 }
 
-buildUnnamed336() {
+buildUnnamed94() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed336(core.List<api.Filter> o) {
+checkUnnamed94(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -238,7 +238,7 @@
   var o = new api.DisplayRule();
   buildCounterDisplayRule++;
   if (buildCounterDisplayRule < 3) {
-    o.filters = buildUnnamed336();
+    o.filters = buildUnnamed94();
     o.lineOptions = buildLineStyle();
     o.name = "foo";
     o.pointOptions = buildPointStyle();
@@ -252,7 +252,7 @@
 checkDisplayRule(api.DisplayRule o) {
   buildCounterDisplayRule++;
   if (buildCounterDisplayRule < 3) {
-    checkUnnamed336(o.filters);
+    checkUnnamed94(o.filters);
     checkLineStyle(o.lineOptions);
     unittest.expect(o.name, unittest.equals('foo'));
     checkPointStyle(o.pointOptions);
@@ -304,27 +304,27 @@
   buildCounterFeatureInfo--;
 }
 
-buildUnnamed337() {
+buildUnnamed95() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed337(core.List<core.String> o) {
+checkUnnamed95(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed338() {
+buildUnnamed96() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed338(core.List<core.String> o) {
+checkUnnamed96(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -335,8 +335,8 @@
   var o = new api.FeaturesBatchDeleteRequest();
   buildCounterFeaturesBatchDeleteRequest++;
   if (buildCounterFeaturesBatchDeleteRequest < 3) {
-    o.gxIds = buildUnnamed337();
-    o.primaryKeys = buildUnnamed338();
+    o.gxIds = buildUnnamed95();
+    o.primaryKeys = buildUnnamed96();
   }
   buildCounterFeaturesBatchDeleteRequest--;
   return o;
@@ -345,20 +345,20 @@
 checkFeaturesBatchDeleteRequest(api.FeaturesBatchDeleteRequest o) {
   buildCounterFeaturesBatchDeleteRequest++;
   if (buildCounterFeaturesBatchDeleteRequest < 3) {
-    checkUnnamed337(o.gxIds);
-    checkUnnamed338(o.primaryKeys);
+    checkUnnamed95(o.gxIds);
+    checkUnnamed96(o.primaryKeys);
   }
   buildCounterFeaturesBatchDeleteRequest--;
 }
 
-buildUnnamed339() {
+buildUnnamed97() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed339(core.List<api.Feature> o) {
+checkUnnamed97(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -369,7 +369,7 @@
   var o = new api.FeaturesBatchInsertRequest();
   buildCounterFeaturesBatchInsertRequest++;
   if (buildCounterFeaturesBatchInsertRequest < 3) {
-    o.features = buildUnnamed339();
+    o.features = buildUnnamed97();
     o.normalizeGeometries = true;
   }
   buildCounterFeaturesBatchInsertRequest--;
@@ -379,20 +379,20 @@
 checkFeaturesBatchInsertRequest(api.FeaturesBatchInsertRequest o) {
   buildCounterFeaturesBatchInsertRequest++;
   if (buildCounterFeaturesBatchInsertRequest < 3) {
-    checkUnnamed339(o.features);
+    checkUnnamed97(o.features);
     unittest.expect(o.normalizeGeometries, unittest.isTrue);
   }
   buildCounterFeaturesBatchInsertRequest--;
 }
 
-buildUnnamed340() {
+buildUnnamed98() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed340(core.List<api.Feature> o) {
+checkUnnamed98(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -403,7 +403,7 @@
   var o = new api.FeaturesBatchPatchRequest();
   buildCounterFeaturesBatchPatchRequest++;
   if (buildCounterFeaturesBatchPatchRequest < 3) {
-    o.features = buildUnnamed340();
+    o.features = buildUnnamed98();
     o.normalizeGeometries = true;
   }
   buildCounterFeaturesBatchPatchRequest--;
@@ -413,20 +413,20 @@
 checkFeaturesBatchPatchRequest(api.FeaturesBatchPatchRequest o) {
   buildCounterFeaturesBatchPatchRequest++;
   if (buildCounterFeaturesBatchPatchRequest < 3) {
-    checkUnnamed340(o.features);
+    checkUnnamed98(o.features);
     unittest.expect(o.normalizeGeometries, unittest.isTrue);
   }
   buildCounterFeaturesBatchPatchRequest--;
 }
 
-buildUnnamed341() {
+buildUnnamed99() {
   var o = new core.List<api.Feature>();
   o.add(buildFeature());
   o.add(buildFeature());
   return o;
 }
 
-checkUnnamed341(core.List<api.Feature> o) {
+checkUnnamed99(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFeature(o[0]);
   checkFeature(o[1]);
@@ -438,7 +438,7 @@
   buildCounterFeaturesListResponse++;
   if (buildCounterFeaturesListResponse < 3) {
     o.allowedQueriesPerSecond = 42.0;
-    o.features = buildUnnamed341();
+    o.features = buildUnnamed99();
     o.nextPageToken = "foo";
     o.schema = buildSchema();
     o.type = "foo";
@@ -451,7 +451,7 @@
   buildCounterFeaturesListResponse++;
   if (buildCounterFeaturesListResponse < 3) {
     unittest.expect(o.allowedQueriesPerSecond, unittest.equals(42.0));
-    checkUnnamed341(o.features);
+    checkUnnamed99(o.features);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkSchema(o.schema);
     unittest.expect(o.type, unittest.equals('foo'));
@@ -513,7 +513,7 @@
   checkGeoJsonGeometryCollection(api.GeoJsonGeometryCollection o) {
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    checkUnnamed342(o.geometries);
+    checkUnnamed100(o.geometries);
   }
   buildCounterGeoJsonGeometryCollection--;
 }
@@ -521,14 +521,14 @@
 (o);
 }
 
-buildUnnamed342() {
+buildUnnamed100() {
   var o = new core.List<api.GeoJsonGeometry>();
   o.add(buildGeoJsonGeometry());
   o.add(buildGeoJsonGeometry());
   return o;
 }
 
-checkUnnamed342(core.List<api.GeoJsonGeometry> o) {
+checkUnnamed100(core.List<api.GeoJsonGeometry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonGeometry(o[0]);
   checkGeoJsonGeometry(o[1]);
@@ -539,7 +539,7 @@
   var o = new api.GeoJsonGeometryCollection();
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    o.geometries = buildUnnamed342();
+    o.geometries = buildUnnamed100();
   }
   buildCounterGeoJsonGeometryCollection--;
   return o;
@@ -548,19 +548,19 @@
 checkGeoJsonGeometryCollection(api.GeoJsonGeometryCollection o) {
   buildCounterGeoJsonGeometryCollection++;
   if (buildCounterGeoJsonGeometryCollection < 3) {
-    checkUnnamed342(o.geometries);
+    checkUnnamed100(o.geometries);
   }
   buildCounterGeoJsonGeometryCollection--;
 }
 
-buildUnnamed343() {
+buildUnnamed101() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed343(core.List<api.GeoJsonPosition> o) {
+checkUnnamed101(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
@@ -571,7 +571,7 @@
   var o = new api.GeoJsonLineString();
   buildCounterGeoJsonLineString++;
   if (buildCounterGeoJsonLineString < 3) {
-    o.coordinates = buildUnnamed343();
+    o.coordinates = buildUnnamed101();
   }
   buildCounterGeoJsonLineString--;
   return o;
@@ -580,35 +580,35 @@
 checkGeoJsonLineString(api.GeoJsonLineString o) {
   buildCounterGeoJsonLineString++;
   if (buildCounterGeoJsonLineString < 3) {
-    checkUnnamed343(o.coordinates);
+    checkUnnamed101(o.coordinates);
   }
   buildCounterGeoJsonLineString--;
 }
 
-buildUnnamed344() {
+buildUnnamed102() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed344(core.List<api.GeoJsonPosition> o) {
+checkUnnamed102(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed345() {
+buildUnnamed103() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed344());
-  o.add(buildUnnamed344());
+  o.add(buildUnnamed102());
+  o.add(buildUnnamed102());
   return o;
 }
 
-checkUnnamed345(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed103(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed344(o[0]);
-  checkUnnamed344(o[1]);
+  checkUnnamed102(o[0]);
+  checkUnnamed102(o[1]);
 }
 
 core.int buildCounterGeoJsonMultiLineString = 0;
@@ -616,7 +616,7 @@
   var o = new api.GeoJsonMultiLineString();
   buildCounterGeoJsonMultiLineString++;
   if (buildCounterGeoJsonMultiLineString < 3) {
-    o.coordinates = buildUnnamed345();
+    o.coordinates = buildUnnamed103();
   }
   buildCounterGeoJsonMultiLineString--;
   return o;
@@ -625,19 +625,19 @@
 checkGeoJsonMultiLineString(api.GeoJsonMultiLineString o) {
   buildCounterGeoJsonMultiLineString++;
   if (buildCounterGeoJsonMultiLineString < 3) {
-    checkUnnamed345(o.coordinates);
+    checkUnnamed103(o.coordinates);
   }
   buildCounterGeoJsonMultiLineString--;
 }
 
-buildUnnamed346() {
+buildUnnamed104() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed346(core.List<api.GeoJsonPosition> o) {
+checkUnnamed104(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
@@ -648,7 +648,7 @@
   var o = new api.GeoJsonMultiPoint();
   buildCounterGeoJsonMultiPoint++;
   if (buildCounterGeoJsonMultiPoint < 3) {
-    o.coordinates = buildUnnamed346();
+    o.coordinates = buildUnnamed104();
   }
   buildCounterGeoJsonMultiPoint--;
   return o;
@@ -657,48 +657,48 @@
 checkGeoJsonMultiPoint(api.GeoJsonMultiPoint o) {
   buildCounterGeoJsonMultiPoint++;
   if (buildCounterGeoJsonMultiPoint < 3) {
-    checkUnnamed346(o.coordinates);
+    checkUnnamed104(o.coordinates);
   }
   buildCounterGeoJsonMultiPoint--;
 }
 
-buildUnnamed347() {
+buildUnnamed105() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed347(core.List<api.GeoJsonPosition> o) {
+checkUnnamed105(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed348() {
+buildUnnamed106() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed347());
-  o.add(buildUnnamed347());
+  o.add(buildUnnamed105());
+  o.add(buildUnnamed105());
   return o;
 }
 
-checkUnnamed348(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed106(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed347(o[0]);
-  checkUnnamed347(o[1]);
+  checkUnnamed105(o[0]);
+  checkUnnamed105(o[1]);
 }
 
-buildUnnamed349() {
+buildUnnamed107() {
   var o = new core.List<core.List<core.List<api.GeoJsonPosition>>>();
-  o.add(buildUnnamed348());
-  o.add(buildUnnamed348());
+  o.add(buildUnnamed106());
+  o.add(buildUnnamed106());
   return o;
 }
 
-checkUnnamed349(core.List<core.List<core.List<api.GeoJsonPosition>>> o) {
+checkUnnamed107(core.List<core.List<core.List<api.GeoJsonPosition>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed348(o[0]);
-  checkUnnamed348(o[1]);
+  checkUnnamed106(o[0]);
+  checkUnnamed106(o[1]);
 }
 
 core.int buildCounterGeoJsonMultiPolygon = 0;
@@ -706,7 +706,7 @@
   var o = new api.GeoJsonMultiPolygon();
   buildCounterGeoJsonMultiPolygon++;
   if (buildCounterGeoJsonMultiPolygon < 3) {
-    o.coordinates = buildUnnamed349();
+    o.coordinates = buildUnnamed107();
   }
   buildCounterGeoJsonMultiPolygon--;
   return o;
@@ -715,7 +715,7 @@
 checkGeoJsonMultiPolygon(api.GeoJsonMultiPolygon o) {
   buildCounterGeoJsonMultiPolygon++;
   if (buildCounterGeoJsonMultiPolygon < 3) {
-    checkUnnamed349(o.coordinates);
+    checkUnnamed107(o.coordinates);
   }
   buildCounterGeoJsonMultiPolygon--;
 }
@@ -739,30 +739,30 @@
   buildCounterGeoJsonPoint--;
 }
 
-buildUnnamed350() {
+buildUnnamed108() {
   var o = new core.List<api.GeoJsonPosition>();
   o.add(buildGeoJsonPosition());
   o.add(buildGeoJsonPosition());
   return o;
 }
 
-checkUnnamed350(core.List<api.GeoJsonPosition> o) {
+checkUnnamed108(core.List<api.GeoJsonPosition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeoJsonPosition(o[0]);
   checkGeoJsonPosition(o[1]);
 }
 
-buildUnnamed351() {
+buildUnnamed109() {
   var o = new core.List<core.List<api.GeoJsonPosition>>();
-  o.add(buildUnnamed350());
-  o.add(buildUnnamed350());
+  o.add(buildUnnamed108());
+  o.add(buildUnnamed108());
   return o;
 }
 
-checkUnnamed351(core.List<core.List<api.GeoJsonPosition>> o) {
+checkUnnamed109(core.List<core.List<api.GeoJsonPosition>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed350(o[0]);
-  checkUnnamed350(o[1]);
+  checkUnnamed108(o[0]);
+  checkUnnamed108(o[1]);
 }
 
 core.int buildCounterGeoJsonPolygon = 0;
@@ -770,7 +770,7 @@
   var o = new api.GeoJsonPolygon();
   buildCounterGeoJsonPolygon++;
   if (buildCounterGeoJsonPolygon < 3) {
-    o.coordinates = buildUnnamed351();
+    o.coordinates = buildUnnamed109();
   }
   buildCounterGeoJsonPolygon--;
   return o;
@@ -779,7 +779,7 @@
 checkGeoJsonPolygon(api.GeoJsonPolygon o) {
   buildCounterGeoJsonPolygon++;
   if (buildCounterGeoJsonPolygon < 3) {
-    checkUnnamed351(o.coordinates);
+    checkUnnamed109(o.coordinates);
   }
   buildCounterGeoJsonPolygon--;
 }
@@ -858,14 +858,14 @@
   buildCounterIconStyle--;
 }
 
-buildUnnamed352() {
+buildUnnamed110() {
   var o = new core.List<api.Icon>();
   o.add(buildIcon());
   o.add(buildIcon());
   return o;
 }
 
-checkUnnamed352(core.List<api.Icon> o) {
+checkUnnamed110(core.List<api.Icon> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIcon(o[0]);
   checkIcon(o[1]);
@@ -876,7 +876,7 @@
   var o = new api.IconsListResponse();
   buildCounterIconsListResponse++;
   if (buildCounterIconsListResponse < 3) {
-    o.icons = buildUnnamed352();
+    o.icons = buildUnnamed110();
     o.nextPageToken = "foo";
   }
   buildCounterIconsListResponse--;
@@ -886,7 +886,7 @@
 checkIconsListResponse(api.IconsListResponse o) {
   buildCounterIconsListResponse++;
   if (buildCounterIconsListResponse < 3) {
-    checkUnnamed352(o.icons);
+    checkUnnamed110(o.icons);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterIconsListResponse--;
@@ -936,14 +936,14 @@
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed353() {
+buildUnnamed111() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed353(core.List<core.double> o) {
+checkUnnamed111(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -954,7 +954,7 @@
   var o = new api.Layer();
   buildCounterLayer++;
   if (buildCounterLayer < 3) {
-    o.bbox = buildUnnamed353();
+    o.bbox = buildUnnamed111();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.datasourceType = "foo";
@@ -982,7 +982,7 @@
 checkLayer(api.Layer o) {
   buildCounterLayer++;
   if (buildCounterLayer < 3) {
-    checkUnnamed353(o.bbox);
+    checkUnnamed111(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.datasourceType, unittest.equals('foo'));
@@ -1006,14 +1006,14 @@
   buildCounterLayer--;
 }
 
-buildUnnamed354() {
+buildUnnamed112() {
   var o = new core.List<api.Layer>();
   o.add(buildLayer());
   o.add(buildLayer());
   return o;
 }
 
-checkUnnamed354(core.List<api.Layer> o) {
+checkUnnamed112(core.List<api.Layer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayer(o[0]);
   checkLayer(o[1]);
@@ -1024,7 +1024,7 @@
   var o = new api.LayersListResponse();
   buildCounterLayersListResponse++;
   if (buildCounterLayersListResponse < 3) {
-    o.layers = buildUnnamed354();
+    o.layers = buildUnnamed112();
     o.nextPageToken = "foo";
   }
   buildCounterLayersListResponse--;
@@ -1034,20 +1034,20 @@
 checkLayersListResponse(api.LayersListResponse o) {
   buildCounterLayersListResponse++;
   if (buildCounterLayersListResponse < 3) {
-    checkUnnamed354(o.layers);
+    checkUnnamed112(o.layers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterLayersListResponse--;
 }
 
-buildUnnamed355() {
+buildUnnamed113() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed355(core.List<core.double> o) {
+checkUnnamed113(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1082,7 +1082,7 @@
   buildCounterLineStyle++;
   if (buildCounterLineStyle < 3) {
     o.border = buildBorder();
-    o.dash = buildUnnamed355();
+    o.dash = buildUnnamed113();
     o.label = buildLabelStyle();
     o.stroke = buildLineStyleStroke();
   }
@@ -1094,34 +1094,34 @@
   buildCounterLineStyle++;
   if (buildCounterLineStyle < 3) {
     checkBorder(o.border);
-    checkUnnamed355(o.dash);
+    checkUnnamed113(o.dash);
     checkLabelStyle(o.label);
     checkLineStyleStroke(o.stroke);
   }
   buildCounterLineStyle--;
 }
 
-buildUnnamed356() {
+buildUnnamed114() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed356(core.List<core.double> o) {
+checkUnnamed114(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed357() {
+buildUnnamed115() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed357(core.List<core.String> o) {
+checkUnnamed115(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1132,7 +1132,7 @@
   var o = new api.Map();
   buildCounterMap++;
   if (buildCounterMap < 3) {
-    o.bbox = buildUnnamed356();
+    o.bbox = buildUnnamed114();
     o.contents = buildMapContents();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
@@ -1149,7 +1149,7 @@
     o.publishedAccessList = "foo";
     o.publishingStatus = "foo";
     o.tags = buildTags();
-    o.versions = buildUnnamed357();
+    o.versions = buildUnnamed115();
     o.writersCanEditPermissions = true;
   }
   buildCounterMap--;
@@ -1159,7 +1159,7 @@
 checkMap(api.Map o) {
   buildCounterMap++;
   if (buildCounterMap < 3) {
-    checkUnnamed356(o.bbox);
+    checkUnnamed114(o.bbox);
     checkMapContents(o.contents);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
@@ -1176,7 +1176,7 @@
     unittest.expect(o.publishedAccessList, unittest.equals('foo'));
     unittest.expect(o.publishingStatus, unittest.equals('foo'));
     checkTags(o.tags);
-    checkUnnamed357(o.versions);
+    checkUnnamed115(o.versions);
     unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterMap--;
@@ -1195,27 +1195,27 @@
   checkMapItem(o[1]);
 }
 
-buildUnnamed358() {
+buildUnnamed116() {
   var o = new core.List<api.MapItem>();
   o.add(buildMapItem());
   o.add(buildMapItem());
   return o;
 }
 
-checkUnnamed358(core.List<api.MapItem> o) {
+checkUnnamed116(core.List<api.MapItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMapItem(o[0]);
   checkMapItem(o[1]);
 }
 
-buildUnnamed359() {
+buildUnnamed117() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed359(core.List<core.double> o) {
+checkUnnamed117(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1226,8 +1226,8 @@
   var o = new api.MapFolder();
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    o.contents = buildUnnamed358();
-    o.defaultViewport = buildUnnamed359();
+    o.contents = buildUnnamed116();
+    o.defaultViewport = buildUnnamed117();
     o.expandable = true;
     o.key = "foo";
     o.name = "foo";
@@ -1240,8 +1240,8 @@
 checkMapFolder(api.MapFolder o) {
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    checkUnnamed358(o.contents);
-    checkUnnamed359(o.defaultViewport);
+    checkUnnamed116(o.contents);
+    checkUnnamed117(o.defaultViewport);
     unittest.expect(o.expandable, unittest.isTrue);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1258,8 +1258,8 @@
   checkMapFolder(api.MapFolder o) {
   buildCounterMapFolder++;
   if (buildCounterMapFolder < 3) {
-    checkUnnamed358(o.contents);
-    checkUnnamed359(o.defaultViewport);
+    checkUnnamed116(o.contents);
+    checkUnnamed117(o.defaultViewport);
     unittest.expect(o.expandable, unittest.isTrue);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1271,14 +1271,14 @@
 (o);
 }
 
-buildUnnamed360() {
+buildUnnamed118() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed360(core.List<core.double> o) {
+checkUnnamed118(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1289,7 +1289,7 @@
   var o = new api.MapKmlLink();
   buildCounterMapKmlLink++;
   if (buildCounterMapKmlLink < 3) {
-    o.defaultViewport = buildUnnamed360();
+    o.defaultViewport = buildUnnamed118();
     o.kmlUrl = "foo";
     o.name = "foo";
     o.visibility = "foo";
@@ -1301,7 +1301,7 @@
 checkMapKmlLink(api.MapKmlLink o) {
   buildCounterMapKmlLink++;
   if (buildCounterMapKmlLink < 3) {
-    checkUnnamed360(o.defaultViewport);
+    checkUnnamed118(o.defaultViewport);
     unittest.expect(o.kmlUrl, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.visibility, unittest.equals('foo'));
@@ -1309,14 +1309,14 @@
   buildCounterMapKmlLink--;
 }
 
-buildUnnamed361() {
+buildUnnamed119() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed361(core.List<core.double> o) {
+checkUnnamed119(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1327,7 +1327,7 @@
   var o = new api.MapLayer();
   buildCounterMapLayer++;
   if (buildCounterMapLayer < 3) {
-    o.defaultViewport = buildUnnamed361();
+    o.defaultViewport = buildUnnamed119();
     o.id = "foo";
     o.key = "foo";
     o.name = "foo";
@@ -1340,7 +1340,7 @@
 checkMapLayer(api.MapLayer o) {
   buildCounterMapLayer++;
   if (buildCounterMapLayer < 3) {
-    checkUnnamed361(o.defaultViewport);
+    checkUnnamed119(o.defaultViewport);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1349,14 +1349,14 @@
   buildCounterMapLayer--;
 }
 
-buildUnnamed362() {
+buildUnnamed120() {
   var o = new core.List<api.Map>();
   o.add(buildMap());
   o.add(buildMap());
   return o;
 }
 
-checkUnnamed362(core.List<api.Map> o) {
+checkUnnamed120(core.List<api.Map> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMap(o[0]);
   checkMap(o[1]);
@@ -1367,7 +1367,7 @@
   var o = new api.MapsListResponse();
   buildCounterMapsListResponse++;
   if (buildCounterMapsListResponse < 3) {
-    o.maps = buildUnnamed362();
+    o.maps = buildUnnamed120();
     o.nextPageToken = "foo";
   }
   buildCounterMapsListResponse--;
@@ -1377,7 +1377,7 @@
 checkMapsListResponse(api.MapsListResponse o) {
   buildCounterMapsListResponse++;
   if (buildCounterMapsListResponse < 3) {
-    checkUnnamed362(o.maps);
+    checkUnnamed120(o.maps);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMapsListResponse--;
@@ -1402,14 +1402,14 @@
   buildCounterParent--;
 }
 
-buildUnnamed363() {
+buildUnnamed121() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed363(core.List<api.Parent> o) {
+checkUnnamed121(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -1421,7 +1421,7 @@
   buildCounterParentsListResponse++;
   if (buildCounterParentsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.parents = buildUnnamed363();
+    o.parents = buildUnnamed121();
   }
   buildCounterParentsListResponse--;
   return o;
@@ -1431,7 +1431,7 @@
   buildCounterParentsListResponse++;
   if (buildCounterParentsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed363(o.parents);
+    checkUnnamed121(o.parents);
   }
   buildCounterParentsListResponse--;
 }
@@ -1461,14 +1461,14 @@
   buildCounterPermission--;
 }
 
-buildUnnamed364() {
+buildUnnamed122() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed364(core.List<core.String> o) {
+checkUnnamed122(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1479,7 +1479,7 @@
   var o = new api.PermissionsBatchDeleteRequest();
   buildCounterPermissionsBatchDeleteRequest++;
   if (buildCounterPermissionsBatchDeleteRequest < 3) {
-    o.ids = buildUnnamed364();
+    o.ids = buildUnnamed122();
   }
   buildCounterPermissionsBatchDeleteRequest--;
   return o;
@@ -1488,7 +1488,7 @@
 checkPermissionsBatchDeleteRequest(api.PermissionsBatchDeleteRequest o) {
   buildCounterPermissionsBatchDeleteRequest++;
   if (buildCounterPermissionsBatchDeleteRequest < 3) {
-    checkUnnamed364(o.ids);
+    checkUnnamed122(o.ids);
   }
   buildCounterPermissionsBatchDeleteRequest--;
 }
@@ -1510,14 +1510,14 @@
   buildCounterPermissionsBatchDeleteResponse--;
 }
 
-buildUnnamed365() {
+buildUnnamed123() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed365(core.List<api.Permission> o) {
+checkUnnamed123(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1528,7 +1528,7 @@
   var o = new api.PermissionsBatchUpdateRequest();
   buildCounterPermissionsBatchUpdateRequest++;
   if (buildCounterPermissionsBatchUpdateRequest < 3) {
-    o.permissions = buildUnnamed365();
+    o.permissions = buildUnnamed123();
   }
   buildCounterPermissionsBatchUpdateRequest--;
   return o;
@@ -1537,7 +1537,7 @@
 checkPermissionsBatchUpdateRequest(api.PermissionsBatchUpdateRequest o) {
   buildCounterPermissionsBatchUpdateRequest++;
   if (buildCounterPermissionsBatchUpdateRequest < 3) {
-    checkUnnamed365(o.permissions);
+    checkUnnamed123(o.permissions);
   }
   buildCounterPermissionsBatchUpdateRequest--;
 }
@@ -1559,14 +1559,14 @@
   buildCounterPermissionsBatchUpdateResponse--;
 }
 
-buildUnnamed366() {
+buildUnnamed124() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed366(core.List<api.Permission> o) {
+checkUnnamed124(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1577,7 +1577,7 @@
   var o = new api.PermissionsListResponse();
   buildCounterPermissionsListResponse++;
   if (buildCounterPermissionsListResponse < 3) {
-    o.permissions = buildUnnamed366();
+    o.permissions = buildUnnamed124();
   }
   buildCounterPermissionsListResponse--;
   return o;
@@ -1586,7 +1586,7 @@
 checkPermissionsListResponse(api.PermissionsListResponse o) {
   buildCounterPermissionsListResponse++;
   if (buildCounterPermissionsListResponse < 3) {
-    checkUnnamed366(o.permissions);
+    checkUnnamed124(o.permissions);
   }
   buildCounterPermissionsListResponse--;
 }
@@ -1671,14 +1671,14 @@
   buildCounterProject--;
 }
 
-buildUnnamed367() {
+buildUnnamed125() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed367(core.List<api.Project> o) {
+checkUnnamed125(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -1689,7 +1689,7 @@
   var o = new api.ProjectsListResponse();
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    o.projects = buildUnnamed367();
+    o.projects = buildUnnamed125();
   }
   buildCounterProjectsListResponse--;
   return o;
@@ -1698,7 +1698,7 @@
 checkProjectsListResponse(api.ProjectsListResponse o) {
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    checkUnnamed367(o.projects);
+    checkUnnamed125(o.projects);
   }
   buildCounterProjectsListResponse--;
 }
@@ -1747,14 +1747,14 @@
   buildCounterPublishedLayer--;
 }
 
-buildUnnamed368() {
+buildUnnamed126() {
   var o = new core.List<api.PublishedLayer>();
   o.add(buildPublishedLayer());
   o.add(buildPublishedLayer());
   return o;
 }
 
-checkUnnamed368(core.List<api.PublishedLayer> o) {
+checkUnnamed126(core.List<api.PublishedLayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedLayer(o[0]);
   checkPublishedLayer(o[1]);
@@ -1765,7 +1765,7 @@
   var o = new api.PublishedLayersListResponse();
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    o.layers = buildUnnamed368();
+    o.layers = buildUnnamed126();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedLayersListResponse--;
@@ -1775,7 +1775,7 @@
 checkPublishedLayersListResponse(api.PublishedLayersListResponse o) {
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    checkUnnamed368(o.layers);
+    checkUnnamed126(o.layers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedLayersListResponse--;
@@ -1810,14 +1810,14 @@
   buildCounterPublishedMap--;
 }
 
-buildUnnamed369() {
+buildUnnamed127() {
   var o = new core.List<api.PublishedMap>();
   o.add(buildPublishedMap());
   o.add(buildPublishedMap());
   return o;
 }
 
-checkUnnamed369(core.List<api.PublishedMap> o) {
+checkUnnamed127(core.List<api.PublishedMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedMap(o[0]);
   checkPublishedMap(o[1]);
@@ -1828,7 +1828,7 @@
   var o = new api.PublishedMapsListResponse();
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    o.maps = buildUnnamed369();
+    o.maps = buildUnnamed127();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedMapsListResponse--;
@@ -1838,33 +1838,33 @@
 checkPublishedMapsListResponse(api.PublishedMapsListResponse o) {
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    checkUnnamed369(o.maps);
+    checkUnnamed127(o.maps);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedMapsListResponse--;
 }
 
-buildUnnamed370() {
+buildUnnamed128() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed370(core.List<core.double> o) {
+checkUnnamed128(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed371() {
+buildUnnamed129() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed371(core.List<api.File> o) {
+checkUnnamed129(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1877,13 +1877,13 @@
   if (buildCounterRaster < 3) {
     o.acquisitionTime = buildAcquisitionTime();
     o.attribution = "foo";
-    o.bbox = buildUnnamed370();
+    o.bbox = buildUnnamed128();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed371();
+    o.files = buildUnnamed129();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.lastModifierEmail = "foo";
@@ -1904,13 +1904,13 @@
   if (buildCounterRaster < 3) {
     checkAcquisitionTime(o.acquisitionTime);
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed370(o.bbox);
+    checkUnnamed128(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed371(o.files);
+    checkUnnamed129(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
@@ -1925,14 +1925,14 @@
   buildCounterRaster--;
 }
 
-buildUnnamed372() {
+buildUnnamed130() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed372(core.List<core.double> o) {
+checkUnnamed130(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1944,7 +1944,7 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     o.attribution = "foo";
-    o.bbox = buildUnnamed372();
+    o.bbox = buildUnnamed130();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
@@ -1969,7 +1969,7 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed372(o.bbox);
+    checkUnnamed130(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -1989,14 +1989,14 @@
   buildCounterRasterCollection--;
 }
 
-buildUnnamed373() {
+buildUnnamed131() {
   var o = new core.List<api.RasterCollection>();
   o.add(buildRasterCollection());
   o.add(buildRasterCollection());
   return o;
 }
 
-checkUnnamed373(core.List<api.RasterCollection> o) {
+checkUnnamed131(core.List<api.RasterCollection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollection(o[0]);
   checkRasterCollection(o[1]);
@@ -2008,7 +2008,7 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasterCollections = buildUnnamed373();
+    o.rasterCollections = buildUnnamed131();
   }
   buildCounterRasterCollectionsListResponse--;
   return o;
@@ -2018,32 +2018,32 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed373(o.rasterCollections);
+    checkUnnamed131(o.rasterCollections);
   }
   buildCounterRasterCollectionsListResponse--;
 }
 
-buildUnnamed374() {
+buildUnnamed132() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed374(core.List<core.double> o) {
+checkUnnamed132(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed375() {
+buildUnnamed133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed375(core.List<core.String> o) {
+checkUnnamed133(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2054,7 +2054,7 @@
   var o = new api.RasterCollectionsRaster();
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    o.bbox = buildUnnamed374();
+    o.bbox = buildUnnamed132();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.description = "foo";
     o.id = "foo";
@@ -2062,7 +2062,7 @@
     o.name = "foo";
     o.projectId = "foo";
     o.rasterType = "foo";
-    o.tags = buildUnnamed375();
+    o.tags = buildUnnamed133();
   }
   buildCounterRasterCollectionsRaster--;
   return o;
@@ -2071,7 +2071,7 @@
 checkRasterCollectionsRaster(api.RasterCollectionsRaster o) {
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    checkUnnamed374(o.bbox);
+    checkUnnamed132(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -2079,19 +2079,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.rasterType, unittest.equals('foo'));
-    checkUnnamed375(o.tags);
+    checkUnnamed133(o.tags);
   }
   buildCounterRasterCollectionsRaster--;
 }
 
-buildUnnamed376() {
+buildUnnamed134() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed376(core.List<core.String> o) {
+checkUnnamed134(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2102,7 +2102,7 @@
   var o = new api.RasterCollectionsRasterBatchDeleteRequest();
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    o.ids = buildUnnamed376();
+    o.ids = buildUnnamed134();
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
   return o;
@@ -2111,7 +2111,7 @@
 checkRasterCollectionsRasterBatchDeleteRequest(api.RasterCollectionsRasterBatchDeleteRequest o) {
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    checkUnnamed376(o.ids);
+    checkUnnamed134(o.ids);
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
 }
@@ -2133,14 +2133,14 @@
   buildCounterRasterCollectionsRastersBatchDeleteResponse--;
 }
 
-buildUnnamed377() {
+buildUnnamed135() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed377(core.List<core.String> o) {
+checkUnnamed135(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2151,7 +2151,7 @@
   var o = new api.RasterCollectionsRastersBatchInsertRequest();
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    o.ids = buildUnnamed377();
+    o.ids = buildUnnamed135();
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
   return o;
@@ -2160,7 +2160,7 @@
 checkRasterCollectionsRastersBatchInsertRequest(api.RasterCollectionsRastersBatchInsertRequest o) {
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    checkUnnamed377(o.ids);
+    checkUnnamed135(o.ids);
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
 }
@@ -2182,14 +2182,14 @@
   buildCounterRasterCollectionsRastersBatchInsertResponse--;
 }
 
-buildUnnamed378() {
+buildUnnamed136() {
   var o = new core.List<api.RasterCollectionsRaster>();
   o.add(buildRasterCollectionsRaster());
   o.add(buildRasterCollectionsRaster());
   return o;
 }
 
-checkUnnamed378(core.List<api.RasterCollectionsRaster> o) {
+checkUnnamed136(core.List<api.RasterCollectionsRaster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollectionsRaster(o[0]);
   checkRasterCollectionsRaster(o[1]);
@@ -2201,7 +2201,7 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed378();
+    o.rasters = buildUnnamed136();
   }
   buildCounterRasterCollectionsRastersListResponse--;
   return o;
@@ -2211,19 +2211,19 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed378(o.rasters);
+    checkUnnamed136(o.rasters);
   }
   buildCounterRasterCollectionsRastersListResponse--;
 }
 
-buildUnnamed379() {
+buildUnnamed137() {
   var o = new core.List<api.Raster>();
   o.add(buildRaster());
   o.add(buildRaster());
   return o;
 }
 
-checkUnnamed379(core.List<api.Raster> o) {
+checkUnnamed137(core.List<api.Raster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRaster(o[0]);
   checkRaster(o[1]);
@@ -2235,7 +2235,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed379();
+    o.rasters = buildUnnamed137();
   }
   buildCounterRastersListResponse--;
   return o;
@@ -2245,7 +2245,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed379(o.rasters);
+    checkUnnamed137(o.rasters);
   }
   buildCounterRastersListResponse--;
 }
@@ -2298,14 +2298,14 @@
   buildCounterScalingFunction--;
 }
 
-buildUnnamed380() {
+buildUnnamed138() {
   var o = new core.List<api.TableColumn>();
   o.add(buildTableColumn());
   o.add(buildTableColumn());
   return o;
 }
 
-checkUnnamed380(core.List<api.TableColumn> o) {
+checkUnnamed138(core.List<api.TableColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableColumn(o[0]);
   checkTableColumn(o[1]);
@@ -2316,7 +2316,7 @@
   var o = new api.Schema();
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    o.columns = buildUnnamed380();
+    o.columns = buildUnnamed138();
     o.primaryGeometry = "foo";
     o.primaryKey = "foo";
   }
@@ -2327,7 +2327,7 @@
 checkSchema(api.Schema o) {
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    checkUnnamed380(o.columns);
+    checkUnnamed138(o.columns);
     unittest.expect(o.primaryGeometry, unittest.equals('foo'));
     unittest.expect(o.primaryKey, unittest.equals('foo'));
   }
@@ -2355,27 +2355,27 @@
   buildCounterSizeRange--;
 }
 
-buildUnnamed381() {
+buildUnnamed139() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed381(core.List<core.double> o) {
+checkUnnamed139(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed382() {
+buildUnnamed140() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed382(core.List<api.File> o) {
+checkUnnamed140(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -2386,13 +2386,13 @@
   var o = new api.Table();
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    o.bbox = buildUnnamed381();
+    o.bbox = buildUnnamed139();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed382();
+    o.files = buildUnnamed140();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.lastModifierEmail = "foo";
@@ -2412,13 +2412,13 @@
 checkTable(api.Table o) {
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    checkUnnamed381(o.bbox);
+    checkUnnamed139(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed382(o.files);
+    checkUnnamed140(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
@@ -2455,14 +2455,14 @@
   buildCounterTableColumn--;
 }
 
-buildUnnamed383() {
+buildUnnamed141() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed383(core.List<api.Table> o) {
+checkUnnamed141(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -2474,7 +2474,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed383();
+    o.tables = buildUnnamed141();
   }
   buildCounterTablesListResponse--;
   return o;
@@ -2484,7 +2484,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed383(o.tables);
+    checkUnnamed141(o.tables);
   }
   buildCounterTablesListResponse--;
 }
@@ -2523,14 +2523,14 @@
   buildCounterValueRange--;
 }
 
-buildUnnamed384() {
+buildUnnamed142() {
   var o = new core.List<api.DisplayRule>();
   o.add(buildDisplayRule());
   o.add(buildDisplayRule());
   return o;
 }
 
-checkUnnamed384(core.List<api.DisplayRule> o) {
+checkUnnamed142(core.List<api.DisplayRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisplayRule(o[0]);
   checkDisplayRule(o[1]);
@@ -2541,7 +2541,7 @@
   var o = new api.VectorStyle();
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    o.displayRules = buildUnnamed384();
+    o.displayRules = buildUnnamed142();
     o.featureInfo = buildFeatureInfo();
     o.type = "foo";
   }
@@ -2552,7 +2552,7 @@
 checkVectorStyle(api.VectorStyle o) {
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    checkUnnamed384(o.displayRules);
+    checkUnnamed142(o.displayRules);
     checkFeatureInfo(o.featureInfo);
     unittest.expect(o.type, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/mirror/v1_test.dart b/generated/googleapis/test/mirror/v1_test.dart
index 9572eb8..f808136 100644
--- a/generated/googleapis/test/mirror/v1_test.dart
+++ b/generated/googleapis/test/mirror/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed153() {
+buildUnnamed754() {
   var o = new core.List<api.AuthToken>();
   o.add(buildAuthToken());
   o.add(buildAuthToken());
   return o;
 }
 
-checkUnnamed153(core.List<api.AuthToken> o) {
+checkUnnamed754(core.List<api.AuthToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthToken(o[0]);
   checkAuthToken(o[1]);
 }
 
-buildUnnamed154() {
+buildUnnamed755() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed154(core.List<core.String> o) {
+checkUnnamed755(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed155() {
+buildUnnamed756() {
   var o = new core.List<api.UserData>();
   o.add(buildUserData());
   o.add(buildUserData());
   return o;
 }
 
-checkUnnamed155(core.List<api.UserData> o) {
+checkUnnamed756(core.List<api.UserData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserData(o[0]);
   checkUserData(o[1]);
@@ -60,10 +60,10 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.authTokens = buildUnnamed153();
-    o.features = buildUnnamed154();
+    o.authTokens = buildUnnamed754();
+    o.features = buildUnnamed755();
     o.password = "foo";
-    o.userData = buildUnnamed155();
+    o.userData = buildUnnamed756();
   }
   buildCounterAccount--;
   return o;
@@ -72,10 +72,10 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed153(o.authTokens);
-    checkUnnamed154(o.features);
+    checkUnnamed754(o.authTokens);
+    checkUnnamed755(o.features);
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed155(o.userData);
+    checkUnnamed756(o.userData);
   }
   buildCounterAccount--;
 }
@@ -105,14 +105,14 @@
   buildCounterAttachment--;
 }
 
-buildUnnamed156() {
+buildUnnamed757() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed156(core.List<api.Attachment> o) {
+checkUnnamed757(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -123,7 +123,7 @@
   var o = new api.AttachmentsListResponse();
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    o.items = buildUnnamed156();
+    o.items = buildUnnamed757();
     o.kind = "foo";
   }
   buildCounterAttachmentsListResponse--;
@@ -133,7 +133,7 @@
 checkAttachmentsListResponse(api.AttachmentsListResponse o) {
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    checkUnnamed156(o.items);
+    checkUnnamed757(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAttachmentsListResponse--;
@@ -179,53 +179,53 @@
   buildCounterCommand--;
 }
 
-buildUnnamed157() {
+buildUnnamed758() {
   var o = new core.List<api.Command>();
   o.add(buildCommand());
   o.add(buildCommand());
   return o;
 }
 
-checkUnnamed157(core.List<api.Command> o) {
+checkUnnamed758(core.List<api.Command> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommand(o[0]);
   checkCommand(o[1]);
 }
 
-buildUnnamed158() {
+buildUnnamed759() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed158(core.List<core.String> o) {
+checkUnnamed759(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed159() {
+buildUnnamed760() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed159(core.List<core.String> o) {
+checkUnnamed760(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed160() {
+buildUnnamed761() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed160(core.List<core.String> o) {
+checkUnnamed761(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -236,15 +236,15 @@
   var o = new api.Contact();
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    o.acceptCommands = buildUnnamed157();
-    o.acceptTypes = buildUnnamed158();
+    o.acceptCommands = buildUnnamed758();
+    o.acceptTypes = buildUnnamed759();
     o.displayName = "foo";
     o.id = "foo";
-    o.imageUrls = buildUnnamed159();
+    o.imageUrls = buildUnnamed760();
     o.kind = "foo";
     o.phoneNumber = "foo";
     o.priority = 42;
-    o.sharingFeatures = buildUnnamed160();
+    o.sharingFeatures = buildUnnamed761();
     o.source = "foo";
     o.speakableName = "foo";
     o.type = "foo";
@@ -256,15 +256,15 @@
 checkContact(api.Contact o) {
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    checkUnnamed157(o.acceptCommands);
-    checkUnnamed158(o.acceptTypes);
+    checkUnnamed758(o.acceptCommands);
+    checkUnnamed759(o.acceptTypes);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed159(o.imageUrls);
+    checkUnnamed760(o.imageUrls);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
-    checkUnnamed160(o.sharingFeatures);
+    checkUnnamed761(o.sharingFeatures);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.speakableName, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -272,14 +272,14 @@
   buildCounterContact--;
 }
 
-buildUnnamed161() {
+buildUnnamed762() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed161(core.List<api.Contact> o) {
+checkUnnamed762(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -290,7 +290,7 @@
   var o = new api.ContactsListResponse();
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    o.items = buildUnnamed161();
+    o.items = buildUnnamed762();
     o.kind = "foo";
   }
   buildCounterContactsListResponse--;
@@ -300,7 +300,7 @@
 checkContactsListResponse(api.ContactsListResponse o) {
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    checkUnnamed161(o.items);
+    checkUnnamed762(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterContactsListResponse--;
@@ -339,14 +339,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed162() {
+buildUnnamed763() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed162(core.List<api.Location> o) {
+checkUnnamed763(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -357,7 +357,7 @@
   var o = new api.LocationsListResponse();
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    o.items = buildUnnamed162();
+    o.items = buildUnnamed763();
     o.kind = "foo";
   }
   buildCounterLocationsListResponse--;
@@ -367,20 +367,20 @@
 checkLocationsListResponse(api.LocationsListResponse o) {
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    checkUnnamed162(o.items);
+    checkUnnamed763(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterLocationsListResponse--;
 }
 
-buildUnnamed163() {
+buildUnnamed764() {
   var o = new core.List<api.MenuValue>();
   o.add(buildMenuValue());
   o.add(buildMenuValue());
   return o;
 }
 
-checkUnnamed163(core.List<api.MenuValue> o) {
+checkUnnamed764(core.List<api.MenuValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuValue(o[0]);
   checkMenuValue(o[1]);
@@ -396,7 +396,7 @@
     o.id = "foo";
     o.payload = "foo";
     o.removeWhenSelected = true;
-    o.values = buildUnnamed163();
+    o.values = buildUnnamed764();
   }
   buildCounterMenuItem--;
   return o;
@@ -410,7 +410,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.removeWhenSelected, unittest.isTrue);
-    checkUnnamed163(o.values);
+    checkUnnamed764(o.values);
   }
   buildCounterMenuItem--;
 }
@@ -438,14 +438,14 @@
   buildCounterMenuValue--;
 }
 
-buildUnnamed164() {
+buildUnnamed765() {
   var o = new core.List<api.UserAction>();
   o.add(buildUserAction());
   o.add(buildUserAction());
   return o;
 }
 
-checkUnnamed164(core.List<api.UserAction> o) {
+checkUnnamed765(core.List<api.UserAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAction(o[0]);
   checkUserAction(o[1]);
@@ -459,7 +459,7 @@
     o.collection = "foo";
     o.itemId = "foo";
     o.operation = "foo";
-    o.userActions = buildUnnamed164();
+    o.userActions = buildUnnamed765();
     o.userToken = "foo";
     o.verifyToken = "foo";
   }
@@ -473,7 +473,7 @@
     unittest.expect(o.collection, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.operation, unittest.equals('foo'));
-    checkUnnamed164(o.userActions);
+    checkUnnamed765(o.userActions);
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
   }
@@ -524,14 +524,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed165() {
+buildUnnamed766() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed165(core.List<core.String> o) {
+checkUnnamed766(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -547,7 +547,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.notification = buildNotification();
-    o.operation = buildUnnamed165();
+    o.operation = buildUnnamed766();
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.userToken = "foo";
     o.verifyToken = "foo";
@@ -564,7 +564,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNotification(o.notification);
-    checkUnnamed165(o.operation);
+    checkUnnamed766(o.operation);
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
@@ -572,14 +572,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed166() {
+buildUnnamed767() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed166(core.List<api.Subscription> o) {
+checkUnnamed767(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -590,7 +590,7 @@
   var o = new api.SubscriptionsListResponse();
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    o.items = buildUnnamed166();
+    o.items = buildUnnamed767();
     o.kind = "foo";
   }
   buildCounterSubscriptionsListResponse--;
@@ -600,46 +600,46 @@
 checkSubscriptionsListResponse(api.SubscriptionsListResponse o) {
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    checkUnnamed166(o.items);
+    checkUnnamed767(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSubscriptionsListResponse--;
 }
 
-buildUnnamed167() {
+buildUnnamed768() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed167(core.List<api.Attachment> o) {
+checkUnnamed768(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
 }
 
-buildUnnamed168() {
+buildUnnamed769() {
   var o = new core.List<api.MenuItem>();
   o.add(buildMenuItem());
   o.add(buildMenuItem());
   return o;
 }
 
-checkUnnamed168(core.List<api.MenuItem> o) {
+checkUnnamed769(core.List<api.MenuItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuItem(o[0]);
   checkMenuItem(o[1]);
 }
 
-buildUnnamed169() {
+buildUnnamed770() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed169(core.List<api.Contact> o) {
+checkUnnamed770(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -650,7 +650,7 @@
   var o = new api.TimelineItem();
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    o.attachments = buildUnnamed167();
+    o.attachments = buildUnnamed768();
     o.bundleId = "foo";
     o.canonicalUrl = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -665,10 +665,10 @@
     o.isPinned = true;
     o.kind = "foo";
     o.location = buildLocation();
-    o.menuItems = buildUnnamed168();
+    o.menuItems = buildUnnamed769();
     o.notification = buildNotificationConfig();
     o.pinScore = 42;
-    o.recipients = buildUnnamed169();
+    o.recipients = buildUnnamed770();
     o.selfLink = "foo";
     o.sourceItemId = "foo";
     o.speakableText = "foo";
@@ -684,7 +684,7 @@
 checkTimelineItem(api.TimelineItem o) {
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    checkUnnamed167(o.attachments);
+    checkUnnamed768(o.attachments);
     unittest.expect(o.bundleId, unittest.equals('foo'));
     unittest.expect(o.canonicalUrl, unittest.equals('foo'));
     unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -699,10 +699,10 @@
     unittest.expect(o.isPinned, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed168(o.menuItems);
+    checkUnnamed769(o.menuItems);
     checkNotificationConfig(o.notification);
     unittest.expect(o.pinScore, unittest.equals(42));
-    checkUnnamed169(o.recipients);
+    checkUnnamed770(o.recipients);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceItemId, unittest.equals('foo'));
     unittest.expect(o.speakableText, unittest.equals('foo'));
@@ -714,14 +714,14 @@
   buildCounterTimelineItem--;
 }
 
-buildUnnamed170() {
+buildUnnamed771() {
   var o = new core.List<api.TimelineItem>();
   o.add(buildTimelineItem());
   o.add(buildTimelineItem());
   return o;
 }
 
-checkUnnamed170(core.List<api.TimelineItem> o) {
+checkUnnamed771(core.List<api.TimelineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimelineItem(o[0]);
   checkTimelineItem(o[1]);
@@ -732,7 +732,7 @@
   var o = new api.TimelineListResponse();
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    o.items = buildUnnamed170();
+    o.items = buildUnnamed771();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -743,7 +743,7 @@
 checkTimelineListResponse(api.TimelineListResponse o) {
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    checkUnnamed170(o.items);
+    checkUnnamed771(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/pagespeedonline/v1_test.dart b/generated/googleapis/test/pagespeedonline/v1_test.dart
index 51a5855..56e76f6 100644
--- a/generated/googleapis/test/pagespeedonline/v1_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs--;
 }
 
-buildUnnamed269() {
+buildUnnamed1020() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   return o;
 }
 
-checkUnnamed269(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
+checkUnnamed1020(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[1]);
@@ -55,7 +55,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    o.args = buildUnnamed269();
+    o.args = buildUnnamed1020();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -65,7 +65,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    checkUnnamed269(o.args);
+    checkUnnamed1020(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -92,14 +92,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs--;
 }
 
-buildUnnamed270() {
+buildUnnamed1021() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   return o;
 }
 
-checkUnnamed270(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
+checkUnnamed1021(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[1]);
@@ -110,7 +110,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    o.args = buildUnnamed270();
+    o.args = buildUnnamed1021();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
@@ -120,20 +120,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    checkUnnamed270(o.args);
+    checkUnnamed1021(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
 }
 
-buildUnnamed271() {
+buildUnnamed1022() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   return o;
 }
 
-checkUnnamed271(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
+checkUnnamed1022(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[1]);
@@ -160,14 +160,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs--;
 }
 
-buildUnnamed272() {
+buildUnnamed1023() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   return o;
 }
 
-checkUnnamed272(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
+checkUnnamed1023(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[1]);
@@ -178,7 +178,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    o.args = buildUnnamed272();
+    o.args = buildUnnamed1023();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -188,7 +188,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    checkUnnamed272(o.args);
+    checkUnnamed1023(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -199,7 +199,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    o.details = buildUnnamed271();
+    o.details = buildUnnamed1022();
     o.result = buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
@@ -209,20 +209,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    checkUnnamed271(o.details);
+    checkUnnamed1022(o.details);
     checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(o.result);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
 }
 
-buildUnnamed273() {
+buildUnnamed1024() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   return o;
 }
 
-checkUnnamed273(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
+checkUnnamed1024(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[1]);
@@ -234,7 +234,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     o.header = buildResultFormattedResultsRuleResultsValueUrlBlocksHeader();
-    o.urls = buildUnnamed273();
+    o.urls = buildUnnamed1024();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
   return o;
@@ -244,19 +244,19 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(o.header);
-    checkUnnamed273(o.urls);
+    checkUnnamed1024(o.urls);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
 }
 
-buildUnnamed274() {
+buildUnnamed1025() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   return o;
 }
 
-checkUnnamed274(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
+checkUnnamed1025(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[1]);
@@ -269,7 +269,7 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     o.localizedRuleName = "foo";
     o.ruleImpact = 42.0;
-    o.urlBlocks = buildUnnamed274();
+    o.urlBlocks = buildUnnamed1025();
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
   return o;
@@ -280,19 +280,19 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     unittest.expect(o.localizedRuleName, unittest.equals('foo'));
     unittest.expect(o.ruleImpact, unittest.equals(42.0));
-    checkUnnamed274(o.urlBlocks);
+    checkUnnamed1025(o.urlBlocks);
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
 }
 
-buildUnnamed275() {
+buildUnnamed1026() {
   var o = new core.Map<core.String, api.ResultFormattedResultsRuleResultsValue>();
   o["x"] = buildResultFormattedResultsRuleResultsValue();
   o["y"] = buildResultFormattedResultsRuleResultsValue();
   return o;
 }
 
-checkUnnamed275(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
+checkUnnamed1026(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValue(o["x"]);
   checkResultFormattedResultsRuleResultsValue(o["y"]);
@@ -304,7 +304,7 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     o.locale = "foo";
-    o.ruleResults = buildUnnamed275();
+    o.ruleResults = buildUnnamed1026();
   }
   buildCounterResultFormattedResults--;
   return o;
@@ -314,19 +314,19 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed275(o.ruleResults);
+    checkUnnamed1026(o.ruleResults);
   }
   buildCounterResultFormattedResults--;
 }
 
-buildUnnamed276() {
+buildUnnamed1027() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed276(core.List<core.String> o) {
+checkUnnamed1027(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -428,7 +428,7 @@
   if (buildCounterResult < 3) {
     o.formattedResults = buildResultFormattedResults();
     o.id = "foo";
-    o.invalidRules = buildUnnamed276();
+    o.invalidRules = buildUnnamed1027();
     o.kind = "foo";
     o.pageStats = buildResultPageStats();
     o.responseCode = 42;
@@ -446,7 +446,7 @@
   if (buildCounterResult < 3) {
     checkResultFormattedResults(o.formattedResults);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed276(o.invalidRules);
+    checkUnnamed1027(o.invalidRules);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkResultPageStats(o.pageStats);
     unittest.expect(o.responseCode, unittest.equals(42));
@@ -458,14 +458,14 @@
   buildCounterResult--;
 }
 
-buildUnnamed277() {
+buildUnnamed1028() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed277(core.List<core.String> o) {
+checkUnnamed1028(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -607,7 +607,7 @@
       var arg_url = "foo";
       var arg_filterThirdPartyResources = true;
       var arg_locale = "foo";
-      var arg_rule = buildUnnamed277();
+      var arg_rule = buildUnnamed1028();
       var arg_screenshot = true;
       var arg_strategy = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/plus/v1_test.dart b/generated/googleapis/test/plus/v1_test.dart
index 48a5212..68212ed 100644
--- a/generated/googleapis/test/plus/v1_test.dart
+++ b/generated/googleapis/test/plus/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed231() {
+buildUnnamed143() {
   var o = new core.List<api.PlusAclentryResource>();
   o.add(buildPlusAclentryResource());
   o.add(buildPlusAclentryResource());
   return o;
 }
 
-checkUnnamed231(core.List<api.PlusAclentryResource> o) {
+checkUnnamed143(core.List<api.PlusAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusAclentryResource(o[0]);
   checkPlusAclentryResource(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.description = "foo";
-    o.items = buildUnnamed231();
+    o.items = buildUnnamed143();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -46,7 +46,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed231(o.items);
+    checkUnnamed143(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -282,14 +282,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed232() {
+buildUnnamed144() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed232(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed144(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -307,7 +307,7 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.thumbnails = buildUnnamed232();
+    o.thumbnails = buildUnnamed144();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -324,20 +324,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed232(o.thumbnails);
+    checkUnnamed144(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed233() {
+buildUnnamed145() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed233(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed145(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -412,7 +412,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed233();
+    o.attachments = buildUnnamed145();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -430,7 +430,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed233(o.attachments);
+    checkUnnamed145(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -519,14 +519,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed234() {
+buildUnnamed146() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed234(core.List<api.Activity> o) {
+checkUnnamed146(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -539,7 +539,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed234();
+    o.items = buildUnnamed146();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -556,7 +556,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed234(o.items);
+    checkUnnamed146(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -632,14 +632,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed235() {
+buildUnnamed147() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed235(core.List<api.CommentInReplyTo> o) {
+checkUnnamed147(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -695,7 +695,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed235();
+    o.inReplyTo = buildUnnamed147();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -714,7 +714,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed235(o.inReplyTo);
+    checkUnnamed147(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -726,14 +726,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed236() {
+buildUnnamed148() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed236(core.List<api.Comment> o) {
+checkUnnamed148(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -746,7 +746,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed236();
+    o.items = buildUnnamed148();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -762,7 +762,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed236(o.items);
+    checkUnnamed148(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -772,79 +772,79 @@
   buildCounterCommentFeed--;
 }
 
-buildUnnamed237() {
+buildUnnamed149() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed237(core.List<core.String> o) {
+checkUnnamed149(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed238() {
+buildUnnamed150() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed238(core.List<api.ItemScope> o) {
+checkUnnamed150(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed239() {
+buildUnnamed151() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed239(core.List<api.ItemScope> o) {
+checkUnnamed151(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed240() {
+buildUnnamed152() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed240(core.List<api.ItemScope> o) {
+checkUnnamed152(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed241() {
+buildUnnamed153() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed241(core.List<api.ItemScope> o) {
+checkUnnamed153(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
 }
 
-buildUnnamed242() {
+buildUnnamed154() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
   o.add(buildItemScope());
   return o;
 }
 
-checkUnnamed242(core.List<api.ItemScope> o) {
+checkUnnamed154(core.List<api.ItemScope> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkItemScope(o[0]);
   checkItemScope(o[1]);
@@ -856,23 +856,23 @@
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     o.about = buildItemScope();
-    o.additionalName = buildUnnamed237();
+    o.additionalName = buildUnnamed149();
     o.address = buildItemScope();
     o.addressCountry = "foo";
     o.addressLocality = "foo";
     o.addressRegion = "foo";
-    o.associatedMedia = buildUnnamed238();
+    o.associatedMedia = buildUnnamed150();
     o.attendeeCount = 42;
-    o.attendees = buildUnnamed239();
+    o.attendees = buildUnnamed151();
     o.audio = buildItemScope();
-    o.author = buildUnnamed240();
+    o.author = buildUnnamed152();
     o.bestRating = "foo";
     o.birthDate = "foo";
     o.byArtist = buildItemScope();
     o.caption = "foo";
     o.contentSize = "foo";
     o.contentUrl = "foo";
-    o.contributor = buildUnnamed241();
+    o.contributor = buildUnnamed153();
     o.dateCreated = "foo";
     o.dateModified = "foo";
     o.datePublished = "foo";
@@ -894,7 +894,7 @@
     o.longitude = 42.0;
     o.name = "foo";
     o.partOfTVSeries = buildItemScope();
-    o.performers = buildUnnamed242();
+    o.performers = buildUnnamed154();
     o.playerType = "foo";
     o.postOfficeBoxNumber = "foo";
     o.postalCode = "foo";
@@ -919,23 +919,23 @@
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     checkItemScope(o.about);
-    checkUnnamed237(o.additionalName);
+    checkUnnamed149(o.additionalName);
     checkItemScope(o.address);
     unittest.expect(o.addressCountry, unittest.equals('foo'));
     unittest.expect(o.addressLocality, unittest.equals('foo'));
     unittest.expect(o.addressRegion, unittest.equals('foo'));
-    checkUnnamed238(o.associatedMedia);
+    checkUnnamed150(o.associatedMedia);
     unittest.expect(o.attendeeCount, unittest.equals(42));
-    checkUnnamed239(o.attendees);
+    checkUnnamed151(o.attendees);
     checkItemScope(o.audio);
-    checkUnnamed240(o.author);
+    checkUnnamed152(o.author);
     unittest.expect(o.bestRating, unittest.equals('foo'));
     unittest.expect(o.birthDate, unittest.equals('foo'));
     checkItemScope(o.byArtist);
     unittest.expect(o.caption, unittest.equals('foo'));
     unittest.expect(o.contentSize, unittest.equals('foo'));
     unittest.expect(o.contentUrl, unittest.equals('foo'));
-    checkUnnamed241(o.contributor);
+    checkUnnamed153(o.contributor);
     unittest.expect(o.dateCreated, unittest.equals('foo'));
     unittest.expect(o.dateModified, unittest.equals('foo'));
     unittest.expect(o.datePublished, unittest.equals('foo'));
@@ -957,7 +957,7 @@
     unittest.expect(o.longitude, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
     checkItemScope(o.partOfTVSeries);
-    checkUnnamed242(o.performers);
+    checkUnnamed154(o.performers);
     unittest.expect(o.playerType, unittest.equals('foo'));
     unittest.expect(o.postOfficeBoxNumber, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
@@ -1008,14 +1008,14 @@
   buildCounterMoment--;
 }
 
-buildUnnamed243() {
+buildUnnamed155() {
   var o = new core.List<api.Moment>();
   o.add(buildMoment());
   o.add(buildMoment());
   return o;
 }
 
-checkUnnamed243(core.List<api.Moment> o) {
+checkUnnamed155(core.List<api.Moment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMoment(o[0]);
   checkMoment(o[1]);
@@ -1027,7 +1027,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed243();
+    o.items = buildUnnamed155();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1043,7 +1043,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed243(o.items);
+    checkUnnamed155(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1054,14 +1054,14 @@
   buildCounterMomentsFeed--;
 }
 
-buildUnnamed244() {
+buildUnnamed156() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed244(core.List<api.Person> o) {
+checkUnnamed156(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1073,7 +1073,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed244();
+    o.items = buildUnnamed156();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1088,7 +1088,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed244(o.items);
+    checkUnnamed156(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1207,14 +1207,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed245() {
+buildUnnamed157() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed245(core.List<api.PersonEmails> o) {
+checkUnnamed157(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1305,14 +1305,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed246() {
+buildUnnamed158() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed246(core.List<api.PersonOrganizations> o) {
+checkUnnamed158(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1339,14 +1339,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed247() {
+buildUnnamed159() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed247(core.List<api.PersonPlacesLived> o) {
+checkUnnamed159(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1375,14 +1375,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed248() {
+buildUnnamed160() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed248(core.List<api.PersonUrls> o) {
+checkUnnamed160(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1402,7 +1402,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed245();
+    o.emails = buildUnnamed157();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1414,14 +1414,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed246();
-    o.placesLived = buildUnnamed247();
+    o.organizations = buildUnnamed158();
+    o.placesLived = buildUnnamed159();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed248();
+    o.urls = buildUnnamed160();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1440,7 +1440,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed245(o.emails);
+    checkUnnamed157(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1452,14 +1452,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed246(o.organizations);
-    checkUnnamed247(o.placesLived);
+    checkUnnamed158(o.organizations);
+    checkUnnamed159(o.placesLived);
     unittest.expect(o.plusOneCount, unittest.equals(42));
     unittest.expect(o.relationshipStatus, unittest.equals('foo'));
     unittest.expect(o.skills, unittest.equals('foo'));
     unittest.expect(o.tagline, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed248(o.urls);
+    checkUnnamed160(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
diff --git a/generated/googleapis/test/plusdomains/v1_test.dart b/generated/googleapis/test/plusdomains/v1_test.dart
index 58069c1..bfa448b 100644
--- a/generated/googleapis/test/plusdomains/v1_test.dart
+++ b/generated/googleapis/test/plusdomains/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1042() {
+buildUnnamed648() {
   var o = new core.List<api.PlusDomainsAclentryResource>();
   o.add(buildPlusDomainsAclentryResource());
   o.add(buildPlusDomainsAclentryResource());
   return o;
 }
 
-checkUnnamed1042(core.List<api.PlusDomainsAclentryResource> o) {
+checkUnnamed648(core.List<api.PlusDomainsAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusDomainsAclentryResource(o[0]);
   checkPlusDomainsAclentryResource(o[1]);
@@ -36,7 +36,7 @@
   if (buildCounterAcl < 3) {
     o.description = "foo";
     o.domainRestricted = true;
-    o.items = buildUnnamed1042();
+    o.items = buildUnnamed648();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -48,7 +48,7 @@
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.domainRestricted, unittest.isTrue);
-    checkUnnamed1042(o.items);
+    checkUnnamed648(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -255,14 +255,14 @@
   buildCounterActivityObjectAttachmentsPreviewThumbnails--;
 }
 
-buildUnnamed1043() {
+buildUnnamed649() {
   var o = new core.List<api.ActivityObjectAttachmentsPreviewThumbnails>();
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   return o;
 }
 
-checkUnnamed1043(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
+checkUnnamed649(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsPreviewThumbnails(o[0]);
   checkActivityObjectAttachmentsPreviewThumbnails(o[1]);
@@ -316,14 +316,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed1044() {
+buildUnnamed650() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed1044(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed650(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -341,8 +341,8 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.previewThumbnails = buildUnnamed1043();
-    o.thumbnails = buildUnnamed1044();
+    o.previewThumbnails = buildUnnamed649();
+    o.thumbnails = buildUnnamed650();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -359,21 +359,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed1043(o.previewThumbnails);
-    checkUnnamed1044(o.thumbnails);
+    checkUnnamed649(o.previewThumbnails);
+    checkUnnamed650(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed1045() {
+buildUnnamed651() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed1045(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed651(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -475,7 +475,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed1045();
+    o.attachments = buildUnnamed651();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -494,7 +494,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed1045(o.attachments);
+    checkUnnamed651(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -584,14 +584,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed1046() {
+buildUnnamed652() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed1046(core.List<api.Activity> o) {
+checkUnnamed652(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -604,7 +604,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed1046();
+    o.items = buildUnnamed652();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -621,7 +621,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1046(o.items);
+    checkUnnamed652(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -659,14 +659,14 @@
   buildCounterAudience--;
 }
 
-buildUnnamed1047() {
+buildUnnamed653() {
   var o = new core.List<api.Audience>();
   o.add(buildAudience());
   o.add(buildAudience());
   return o;
 }
 
-checkUnnamed1047(core.List<api.Audience> o) {
+checkUnnamed653(core.List<api.Audience> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudience(o[0]);
   checkAudience(o[1]);
@@ -678,7 +678,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1047();
+    o.items = buildUnnamed653();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -691,7 +691,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1047(o.items);
+    checkUnnamed653(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -749,14 +749,14 @@
   buildCounterCircle--;
 }
 
-buildUnnamed1048() {
+buildUnnamed654() {
   var o = new core.List<api.Circle>();
   o.add(buildCircle());
   o.add(buildCircle());
   return o;
 }
 
-checkUnnamed1048(core.List<api.Circle> o) {
+checkUnnamed654(core.List<api.Circle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCircle(o[0]);
   checkCircle(o[1]);
@@ -768,7 +768,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1048();
+    o.items = buildUnnamed654();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -784,7 +784,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1048(o.items);
+    checkUnnamed654(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -860,14 +860,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed1049() {
+buildUnnamed655() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed1049(core.List<api.CommentInReplyTo> o) {
+checkUnnamed655(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -923,7 +923,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed1049();
+    o.inReplyTo = buildUnnamed655();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -942,7 +942,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1049(o.inReplyTo);
+    checkUnnamed655(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -954,14 +954,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed1050() {
+buildUnnamed656() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed1050(core.List<api.Comment> o) {
+checkUnnamed656(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -974,7 +974,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed1050();
+    o.items = buildUnnamed656();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -990,7 +990,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1050(o.items);
+    checkUnnamed656(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1063,14 +1063,14 @@
   buildCounterMediaExif--;
 }
 
-buildUnnamed1051() {
+buildUnnamed657() {
   var o = new core.List<api.Videostream>();
   o.add(buildVideostream());
   o.add(buildVideostream());
   return o;
 }
 
-checkUnnamed1051(core.List<api.Videostream> o) {
+checkUnnamed657(core.List<api.Videostream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideostream(o[0]);
   checkVideostream(o[1]);
@@ -1092,7 +1092,7 @@
     o.mediaUrl = "foo";
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.sizeBytes = "foo";
-    o.streams = buildUnnamed1051();
+    o.streams = buildUnnamed657();
     o.summary = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.url = "foo";
@@ -1118,7 +1118,7 @@
     unittest.expect(o.mediaUrl, unittest.equals('foo'));
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.sizeBytes, unittest.equals('foo'));
-    checkUnnamed1051(o.streams);
+    checkUnnamed657(o.streams);
     unittest.expect(o.summary, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.url, unittest.equals('foo'));
@@ -1129,14 +1129,14 @@
   buildCounterMedia--;
 }
 
-buildUnnamed1052() {
+buildUnnamed658() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed1052(core.List<api.Person> o) {
+checkUnnamed658(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1148,7 +1148,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1052();
+    o.items = buildUnnamed658();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1163,7 +1163,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1052(o.items);
+    checkUnnamed658(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1261,14 +1261,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed1053() {
+buildUnnamed659() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed1053(core.List<api.PersonEmails> o) {
+checkUnnamed659(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1359,14 +1359,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed1054() {
+buildUnnamed660() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed1054(core.List<api.PersonOrganizations> o) {
+checkUnnamed660(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1393,14 +1393,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed1055() {
+buildUnnamed661() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed1055(core.List<api.PersonPlacesLived> o) {
+checkUnnamed661(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1429,14 +1429,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed1056() {
+buildUnnamed662() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed1056(core.List<api.PersonUrls> o) {
+checkUnnamed662(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1455,7 +1455,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed1053();
+    o.emails = buildUnnamed659();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1466,14 +1466,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed1054();
-    o.placesLived = buildUnnamed1055();
+    o.organizations = buildUnnamed660();
+    o.placesLived = buildUnnamed661();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed1056();
+    o.urls = buildUnnamed662();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1491,7 +1491,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed1053(o.emails);
+    checkUnnamed659(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1502,14 +1502,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed1054(o.organizations);
-    checkUnnamed1055(o.placesLived);
+    checkUnnamed660(o.organizations);
+    checkUnnamed661(o.placesLived);
     unittest.expect(o.plusOneCount, unittest.equals(42));
     unittest.expect(o.relationshipStatus, unittest.equals('foo'));
     unittest.expect(o.skills, unittest.equals('foo'));
     unittest.expect(o.tagline, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed1056(o.urls);
+    checkUnnamed662(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
@@ -1630,53 +1630,53 @@
   buildCounterVideostream--;
 }
 
-buildUnnamed1057() {
+buildUnnamed663() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1057(core.List<core.String> o) {
+checkUnnamed663(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1058() {
+buildUnnamed664() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1058(core.List<core.String> o) {
+checkUnnamed664(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1059() {
+buildUnnamed665() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1059(core.List<core.String> o) {
+checkUnnamed665(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1060() {
+buildUnnamed666() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1060(core.List<core.String> o) {
+checkUnnamed666(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2401,8 +2401,8 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed1057();
-      var arg_userId = buildUnnamed1058();
+      var arg_email = buildUnnamed663();
+      var arg_userId = buildUnnamed664();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2721,8 +2721,8 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed1059();
-      var arg_userId = buildUnnamed1060();
+      var arg_email = buildUnnamed665();
+      var arg_userId = buildUnnamed666();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/prediction/v1_6_test.dart b/generated/googleapis/test/prediction/v1_6_test.dart
index 0004956..0f6a7bc 100644
--- a/generated/googleapis/test/prediction/v1_6_test.dart
+++ b/generated/googleapis/test/prediction/v1_6_test.dart
@@ -37,14 +37,14 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues--;
 }
 
-buildUnnamed590() {
+buildUnnamed799() {
   var o = new core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues>();
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   return o;
 }
 
-checkUnnamed590(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
+checkUnnamed799(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[0]);
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[1]);
@@ -56,7 +56,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     o.count = "foo";
-    o.values = buildUnnamed590();
+    o.values = buildUnnamed799();
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed590(o.values);
+    checkUnnamed799(o.values);
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
 }
@@ -138,14 +138,14 @@
   buildCounterAnalyzeDataDescriptionFeatures--;
 }
 
-buildUnnamed591() {
+buildUnnamed800() {
   var o = new core.List<api.AnalyzeDataDescriptionFeatures>();
   o.add(buildAnalyzeDataDescriptionFeatures());
   o.add(buildAnalyzeDataDescriptionFeatures());
   return o;
 }
 
-checkUnnamed591(core.List<api.AnalyzeDataDescriptionFeatures> o) {
+checkUnnamed800(core.List<api.AnalyzeDataDescriptionFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeatures(o[0]);
   checkAnalyzeDataDescriptionFeatures(o[1]);
@@ -195,14 +195,14 @@
   buildCounterAnalyzeDataDescriptionOutputFeatureText--;
 }
 
-buildUnnamed592() {
+buildUnnamed801() {
   var o = new core.List<api.AnalyzeDataDescriptionOutputFeatureText>();
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   return o;
 }
 
-checkUnnamed592(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
+checkUnnamed801(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionOutputFeatureText(o[0]);
   checkAnalyzeDataDescriptionOutputFeatureText(o[1]);
@@ -214,7 +214,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     o.numeric = buildAnalyzeDataDescriptionOutputFeatureNumeric();
-    o.text = buildUnnamed592();
+    o.text = buildUnnamed801();
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
   return o;
@@ -224,7 +224,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     checkAnalyzeDataDescriptionOutputFeatureNumeric(o.numeric);
-    checkUnnamed592(o.text);
+    checkUnnamed801(o.text);
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
 }
@@ -234,7 +234,7 @@
   var o = new api.AnalyzeDataDescription();
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    o.features = buildUnnamed591();
+    o.features = buildUnnamed800();
     o.outputFeature = buildAnalyzeDataDescriptionOutputFeature();
   }
   buildCounterAnalyzeDataDescription--;
@@ -244,72 +244,72 @@
 checkAnalyzeDataDescription(api.AnalyzeDataDescription o) {
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    checkUnnamed591(o.features);
+    checkUnnamed800(o.features);
     checkAnalyzeDataDescriptionOutputFeature(o.outputFeature);
   }
   buildCounterAnalyzeDataDescription--;
 }
 
-buildUnnamed593() {
+buildUnnamed802() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed593(core.Map<core.String, core.String> o) {
+checkUnnamed802(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed594() {
+buildUnnamed803() {
   var o = new core.List<core.Map<core.String, core.String>>();
-  o.add(buildUnnamed593());
-  o.add(buildUnnamed593());
+  o.add(buildUnnamed802());
+  o.add(buildUnnamed802());
   return o;
 }
 
-checkUnnamed594(core.List<core.Map<core.String, core.String>> o) {
+checkUnnamed803(core.List<core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed593(o[0]);
-  checkUnnamed593(o[1]);
+  checkUnnamed802(o[0]);
+  checkUnnamed802(o[1]);
 }
 
-buildUnnamed595() {
+buildUnnamed804() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed595(core.Map<core.String, core.String> o) {
+checkUnnamed804(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed596() {
+buildUnnamed805() {
   var o = new core.Map<core.String, core.Map<core.String, core.String>>();
-  o["x"] = buildUnnamed595();
-  o["y"] = buildUnnamed595();
+  o["x"] = buildUnnamed804();
+  o["y"] = buildUnnamed804();
   return o;
 }
 
-checkUnnamed596(core.Map<core.String, core.Map<core.String, core.String>> o) {
+checkUnnamed805(core.Map<core.String, core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed595(o["x"]);
-  checkUnnamed595(o["y"]);
+  checkUnnamed804(o["x"]);
+  checkUnnamed804(o["y"]);
 }
 
-buildUnnamed597() {
+buildUnnamed806() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed597(core.Map<core.String, core.String> o) {
+checkUnnamed806(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -320,8 +320,8 @@
   var o = new api.AnalyzeModelDescription();
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    o.confusionMatrix = buildUnnamed596();
-    o.confusionMatrixRowTotals = buildUnnamed597();
+    o.confusionMatrix = buildUnnamed805();
+    o.confusionMatrixRowTotals = buildUnnamed806();
     o.modelinfo = buildInsert2();
   }
   buildCounterAnalyzeModelDescription--;
@@ -331,8 +331,8 @@
 checkAnalyzeModelDescription(api.AnalyzeModelDescription o) {
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    checkUnnamed596(o.confusionMatrix);
-    checkUnnamed597(o.confusionMatrixRowTotals);
+    checkUnnamed805(o.confusionMatrix);
+    checkUnnamed806(o.confusionMatrixRowTotals);
     checkInsert2(o.modelinfo);
   }
   buildCounterAnalyzeModelDescription--;
@@ -344,7 +344,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     o.dataDescription = buildAnalyzeDataDescription();
-    o.errors = buildUnnamed594();
+    o.errors = buildUnnamed803();
     o.id = "foo";
     o.kind = "foo";
     o.modelDescription = buildAnalyzeModelDescription();
@@ -358,7 +358,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     checkAnalyzeDataDescription(o.dataDescription);
-    checkUnnamed594(o.errors);
+    checkUnnamed803(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkAnalyzeModelDescription(o.modelDescription);
@@ -367,14 +367,14 @@
   buildCounterAnalyze--;
 }
 
-buildUnnamed598() {
+buildUnnamed807() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed598(core.List<core.Object> o) {
+checkUnnamed807(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -385,7 +385,7 @@
   var o = new api.InputInput();
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    o.csvInstance = buildUnnamed598();
+    o.csvInstance = buildUnnamed807();
   }
   buildCounterInputInput--;
   return o;
@@ -394,7 +394,7 @@
 checkInputInput(api.InputInput o) {
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    checkUnnamed598(o.csvInstance);
+    checkUnnamed807(o.csvInstance);
   }
   buildCounterInputInput--;
 }
@@ -418,14 +418,14 @@
   buildCounterInput--;
 }
 
-buildUnnamed599() {
+buildUnnamed808() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed599(core.List<core.Object> o) {
+checkUnnamed808(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
   var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
@@ -436,7 +436,7 @@
   var o = new api.InsertTrainingInstances();
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    o.csvInstance = buildUnnamed599();
+    o.csvInstance = buildUnnamed808();
     o.output = "foo";
   }
   buildCounterInsertTrainingInstances--;
@@ -446,49 +446,49 @@
 checkInsertTrainingInstances(api.InsertTrainingInstances o) {
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    checkUnnamed599(o.csvInstance);
+    checkUnnamed808(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterInsertTrainingInstances--;
 }
 
-buildUnnamed600() {
+buildUnnamed809() {
   var o = new core.List<api.InsertTrainingInstances>();
   o.add(buildInsertTrainingInstances());
   o.add(buildInsertTrainingInstances());
   return o;
 }
 
-checkUnnamed600(core.List<api.InsertTrainingInstances> o) {
+checkUnnamed809(core.List<api.InsertTrainingInstances> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsertTrainingInstances(o[0]);
   checkInsertTrainingInstances(o[1]);
 }
 
-buildUnnamed601() {
+buildUnnamed810() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed601(core.Map<core.String, core.double> o) {
+checkUnnamed810(core.Map<core.String, core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42.0));
   unittest.expect(o["y"], unittest.equals(42.0));
 }
 
-buildUnnamed602() {
+buildUnnamed811() {
   var o = new core.List<core.Map<core.String, core.double>>();
-  o.add(buildUnnamed601());
-  o.add(buildUnnamed601());
+  o.add(buildUnnamed810());
+  o.add(buildUnnamed810());
   return o;
 }
 
-checkUnnamed602(core.List<core.Map<core.String, core.double>> o) {
+checkUnnamed811(core.List<core.Map<core.String, core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed601(o[0]);
-  checkUnnamed601(o[1]);
+  checkUnnamed810(o[0]);
+  checkUnnamed810(o[1]);
 }
 
 core.int buildCounterInsert = 0;
@@ -502,8 +502,8 @@
     o.storageDataLocation = "foo";
     o.storagePMMLLocation = "foo";
     o.storagePMMLModelLocation = "foo";
-    o.trainingInstances = buildUnnamed600();
-    o.utility = buildUnnamed602();
+    o.trainingInstances = buildUnnamed809();
+    o.utility = buildUnnamed811();
   }
   buildCounterInsert--;
   return o;
@@ -518,8 +518,8 @@
     unittest.expect(o.storageDataLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLModelLocation, unittest.equals('foo'));
-    checkUnnamed600(o.trainingInstances);
-    checkUnnamed602(o.utility);
+    checkUnnamed809(o.trainingInstances);
+    checkUnnamed811(o.utility);
   }
   buildCounterInsert--;
 }
@@ -592,14 +592,14 @@
   buildCounterInsert2--;
 }
 
-buildUnnamed603() {
+buildUnnamed812() {
   var o = new core.List<api.Insert2>();
   o.add(buildInsert2());
   o.add(buildInsert2());
   return o;
 }
 
-checkUnnamed603(core.List<api.Insert2> o) {
+checkUnnamed812(core.List<api.Insert2> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsert2(o[0]);
   checkInsert2(o[1]);
@@ -610,7 +610,7 @@
   var o = new api.List();
   buildCounterList++;
   if (buildCounterList < 3) {
-    o.items = buildUnnamed603();
+    o.items = buildUnnamed812();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -622,7 +622,7 @@
 checkList(api.List o) {
   buildCounterList++;
   if (buildCounterList < 3) {
-    checkUnnamed603(o.items);
+    checkUnnamed812(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -651,14 +651,14 @@
   buildCounterOutputOutputMulti--;
 }
 
-buildUnnamed604() {
+buildUnnamed813() {
   var o = new core.List<api.OutputOutputMulti>();
   o.add(buildOutputOutputMulti());
   o.add(buildOutputOutputMulti());
   return o;
 }
 
-checkUnnamed604(core.List<api.OutputOutputMulti> o) {
+checkUnnamed813(core.List<api.OutputOutputMulti> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOutputOutputMulti(o[0]);
   checkOutputOutputMulti(o[1]);
@@ -672,7 +672,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.outputLabel = "foo";
-    o.outputMulti = buildUnnamed604();
+    o.outputMulti = buildUnnamed813();
     o.outputValue = "foo";
     o.selfLink = "foo";
   }
@@ -686,21 +686,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.outputLabel, unittest.equals('foo'));
-    checkUnnamed604(o.outputMulti);
+    checkUnnamed813(o.outputMulti);
     unittest.expect(o.outputValue, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterOutput--;
 }
 
-buildUnnamed605() {
+buildUnnamed814() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed605(core.List<core.Object> o) {
+checkUnnamed814(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
   var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
@@ -711,7 +711,7 @@
   var o = new api.Update();
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    o.csvInstance = buildUnnamed605();
+    o.csvInstance = buildUnnamed814();
     o.output = "foo";
   }
   buildCounterUpdate--;
@@ -721,7 +721,7 @@
 checkUpdate(api.Update o) {
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    checkUnnamed605(o.csvInstance);
+    checkUnnamed814(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterUpdate--;
diff --git a/generated/googleapis/test/qpxexpress/v1_test.dart b/generated/googleapis/test/qpxexpress/v1_test.dart
index 854fdae..daea4bc 100644
--- a/generated/googleapis/test/qpxexpress/v1_test.dart
+++ b/generated/googleapis/test/qpxexpress/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterAirportData--;
 }
 
-buildUnnamed314() {
+buildUnnamed1() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed314(core.List<core.String> o) {
+checkUnnamed1(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -84,7 +84,7 @@
   if (buildCounterBagDescriptor < 3) {
     o.commercialName = "foo";
     o.count = 42;
-    o.description = buildUnnamed314();
+    o.description = buildUnnamed1();
     o.kind = "foo";
     o.subcode = "foo";
   }
@@ -97,7 +97,7 @@
   if (buildCounterBagDescriptor < 3) {
     unittest.expect(o.commercialName, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals(42));
-    checkUnnamed314(o.description);
+    checkUnnamed1(o.description);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.subcode, unittest.equals('foo'));
   }
@@ -152,66 +152,66 @@
   buildCounterCityData--;
 }
 
-buildUnnamed315() {
+buildUnnamed2() {
   var o = new core.List<api.AircraftData>();
   o.add(buildAircraftData());
   o.add(buildAircraftData());
   return o;
 }
 
-checkUnnamed315(core.List<api.AircraftData> o) {
+checkUnnamed2(core.List<api.AircraftData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAircraftData(o[0]);
   checkAircraftData(o[1]);
 }
 
-buildUnnamed316() {
+buildUnnamed3() {
   var o = new core.List<api.AirportData>();
   o.add(buildAirportData());
   o.add(buildAirportData());
   return o;
 }
 
-checkUnnamed316(core.List<api.AirportData> o) {
+checkUnnamed3(core.List<api.AirportData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAirportData(o[0]);
   checkAirportData(o[1]);
 }
 
-buildUnnamed317() {
+buildUnnamed4() {
   var o = new core.List<api.CarrierData>();
   o.add(buildCarrierData());
   o.add(buildCarrierData());
   return o;
 }
 
-checkUnnamed317(core.List<api.CarrierData> o) {
+checkUnnamed4(core.List<api.CarrierData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCarrierData(o[0]);
   checkCarrierData(o[1]);
 }
 
-buildUnnamed318() {
+buildUnnamed5() {
   var o = new core.List<api.CityData>();
   o.add(buildCityData());
   o.add(buildCityData());
   return o;
 }
 
-checkUnnamed318(core.List<api.CityData> o) {
+checkUnnamed5(core.List<api.CityData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCityData(o[0]);
   checkCityData(o[1]);
 }
 
-buildUnnamed319() {
+buildUnnamed6() {
   var o = new core.List<api.TaxData>();
   o.add(buildTaxData());
   o.add(buildTaxData());
   return o;
 }
 
-checkUnnamed319(core.List<api.TaxData> o) {
+checkUnnamed6(core.List<api.TaxData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxData(o[0]);
   checkTaxData(o[1]);
@@ -222,12 +222,12 @@
   var o = new api.Data();
   buildCounterData++;
   if (buildCounterData < 3) {
-    o.aircraft = buildUnnamed315();
-    o.airport = buildUnnamed316();
-    o.carrier = buildUnnamed317();
-    o.city = buildUnnamed318();
+    o.aircraft = buildUnnamed2();
+    o.airport = buildUnnamed3();
+    o.carrier = buildUnnamed4();
+    o.city = buildUnnamed5();
     o.kind = "foo";
-    o.tax = buildUnnamed319();
+    o.tax = buildUnnamed6();
   }
   buildCounterData--;
   return o;
@@ -236,12 +236,12 @@
 checkData(api.Data o) {
   buildCounterData++;
   if (buildCounterData < 3) {
-    checkUnnamed315(o.aircraft);
-    checkUnnamed316(o.airport);
-    checkUnnamed317(o.carrier);
-    checkUnnamed318(o.city);
+    checkUnnamed2(o.aircraft);
+    checkUnnamed3(o.airport);
+    checkUnnamed4(o.carrier);
+    checkUnnamed5(o.city);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed319(o.tax);
+    checkUnnamed6(o.tax);
   }
   buildCounterData--;
 }
@@ -298,14 +298,14 @@
   buildCounterFlightInfo--;
 }
 
-buildUnnamed320() {
+buildUnnamed7() {
   var o = new core.List<api.BagDescriptor>();
   o.add(buildBagDescriptor());
   o.add(buildBagDescriptor());
   return o;
 }
 
-checkUnnamed320(core.List<api.BagDescriptor> o) {
+checkUnnamed7(core.List<api.BagDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBagDescriptor(o[0]);
   checkBagDescriptor(o[1]);
@@ -316,7 +316,7 @@
   var o = new api.FreeBaggageAllowance();
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    o.bagDescriptor = buildUnnamed320();
+    o.bagDescriptor = buildUnnamed7();
     o.kilos = 42;
     o.kilosPerPiece = 42;
     o.kind = "foo";
@@ -330,7 +330,7 @@
 checkFreeBaggageAllowance(api.FreeBaggageAllowance o) {
   buildCounterFreeBaggageAllowance++;
   if (buildCounterFreeBaggageAllowance < 3) {
-    checkUnnamed320(o.bagDescriptor);
+    checkUnnamed7(o.bagDescriptor);
     unittest.expect(o.kilos, unittest.equals(42));
     unittest.expect(o.kilosPerPiece, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -420,40 +420,40 @@
   buildCounterPassengerCounts--;
 }
 
-buildUnnamed321() {
+buildUnnamed8() {
   var o = new core.List<api.FareInfo>();
   o.add(buildFareInfo());
   o.add(buildFareInfo());
   return o;
 }
 
-checkUnnamed321(core.List<api.FareInfo> o) {
+checkUnnamed8(core.List<api.FareInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFareInfo(o[0]);
   checkFareInfo(o[1]);
 }
 
-buildUnnamed322() {
+buildUnnamed9() {
   var o = new core.List<api.SegmentPricing>();
   o.add(buildSegmentPricing());
   o.add(buildSegmentPricing());
   return o;
 }
 
-checkUnnamed322(core.List<api.SegmentPricing> o) {
+checkUnnamed9(core.List<api.SegmentPricing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentPricing(o[0]);
   checkSegmentPricing(o[1]);
 }
 
-buildUnnamed323() {
+buildUnnamed10() {
   var o = new core.List<api.TaxInfo>();
   o.add(buildTaxInfo());
   o.add(buildTaxInfo());
   return o;
 }
 
-checkUnnamed323(core.List<api.TaxInfo> o) {
+checkUnnamed10(core.List<api.TaxInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaxInfo(o[0]);
   checkTaxInfo(o[1]);
@@ -465,7 +465,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     o.baseFareTotal = "foo";
-    o.fare = buildUnnamed321();
+    o.fare = buildUnnamed8();
     o.fareCalculation = "foo";
     o.kind = "foo";
     o.latestTicketingTime = "foo";
@@ -475,8 +475,8 @@
     o.saleFareTotal = "foo";
     o.saleTaxTotal = "foo";
     o.saleTotal = "foo";
-    o.segmentPricing = buildUnnamed322();
-    o.tax = buildUnnamed323();
+    o.segmentPricing = buildUnnamed9();
+    o.tax = buildUnnamed10();
   }
   buildCounterPricingInfo--;
   return o;
@@ -486,7 +486,7 @@
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
     unittest.expect(o.baseFareTotal, unittest.equals('foo'));
-    checkUnnamed321(o.fare);
+    checkUnnamed8(o.fare);
     unittest.expect(o.fareCalculation, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latestTicketingTime, unittest.equals('foo'));
@@ -496,20 +496,20 @@
     unittest.expect(o.saleFareTotal, unittest.equals('foo'));
     unittest.expect(o.saleTaxTotal, unittest.equals('foo'));
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed322(o.segmentPricing);
-    checkUnnamed323(o.tax);
+    checkUnnamed9(o.segmentPricing);
+    checkUnnamed10(o.tax);
   }
   buildCounterPricingInfo--;
 }
 
-buildUnnamed324() {
+buildUnnamed11() {
   var o = new core.List<api.LegInfo>();
   o.add(buildLegInfo());
   o.add(buildLegInfo());
   return o;
 }
 
-checkUnnamed324(core.List<api.LegInfo> o) {
+checkUnnamed11(core.List<api.LegInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLegInfo(o[0]);
   checkLegInfo(o[1]);
@@ -528,7 +528,7 @@
     o.flight = buildFlightInfo();
     o.id = "foo";
     o.kind = "foo";
-    o.leg = buildUnnamed324();
+    o.leg = buildUnnamed11();
     o.marriedSegmentGroup = "foo";
     o.subjectToGovernmentApproval = true;
   }
@@ -547,21 +547,21 @@
     checkFlightInfo(o.flight);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed324(o.leg);
+    checkUnnamed11(o.leg);
     unittest.expect(o.marriedSegmentGroup, unittest.equals('foo'));
     unittest.expect(o.subjectToGovernmentApproval, unittest.isTrue);
   }
   buildCounterSegmentInfo--;
 }
 
-buildUnnamed325() {
+buildUnnamed12() {
   var o = new core.List<api.FreeBaggageAllowance>();
   o.add(buildFreeBaggageAllowance());
   o.add(buildFreeBaggageAllowance());
   return o;
 }
 
-checkUnnamed325(core.List<api.FreeBaggageAllowance> o) {
+checkUnnamed12(core.List<api.FreeBaggageAllowance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBaggageAllowance(o[0]);
   checkFreeBaggageAllowance(o[1]);
@@ -573,7 +573,7 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     o.fareId = "foo";
-    o.freeBaggageOption = buildUnnamed325();
+    o.freeBaggageOption = buildUnnamed12();
     o.kind = "foo";
     o.segmentId = "foo";
   }
@@ -585,21 +585,21 @@
   buildCounterSegmentPricing++;
   if (buildCounterSegmentPricing < 3) {
     unittest.expect(o.fareId, unittest.equals('foo'));
-    checkUnnamed325(o.freeBaggageOption);
+    checkUnnamed12(o.freeBaggageOption);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.segmentId, unittest.equals('foo'));
   }
   buildCounterSegmentPricing--;
 }
 
-buildUnnamed326() {
+buildUnnamed13() {
   var o = new core.List<api.SegmentInfo>();
   o.add(buildSegmentInfo());
   o.add(buildSegmentInfo());
   return o;
 }
 
-checkUnnamed326(core.List<api.SegmentInfo> o) {
+checkUnnamed13(core.List<api.SegmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegmentInfo(o[0]);
   checkSegmentInfo(o[1]);
@@ -612,7 +612,7 @@
   if (buildCounterSliceInfo < 3) {
     o.duration = 42;
     o.kind = "foo";
-    o.segment = buildUnnamed326();
+    o.segment = buildUnnamed13();
   }
   buildCounterSliceInfo--;
   return o;
@@ -623,32 +623,32 @@
   if (buildCounterSliceInfo < 3) {
     unittest.expect(o.duration, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed326(o.segment);
+    checkUnnamed13(o.segment);
   }
   buildCounterSliceInfo--;
 }
 
-buildUnnamed327() {
+buildUnnamed14() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed327(core.List<core.String> o) {
+checkUnnamed14(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed328() {
+buildUnnamed15() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed328(core.List<core.String> o) {
+checkUnnamed15(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -666,10 +666,10 @@
     o.maxConnectionDuration = 42;
     o.maxStops = 42;
     o.origin = "foo";
-    o.permittedCarrier = buildUnnamed327();
+    o.permittedCarrier = buildUnnamed14();
     o.permittedDepartureTime = buildTimeOfDayRange();
     o.preferredCabin = "foo";
-    o.prohibitedCarrier = buildUnnamed328();
+    o.prohibitedCarrier = buildUnnamed15();
   }
   buildCounterSliceInput--;
   return o;
@@ -685,10 +685,10 @@
     unittest.expect(o.maxConnectionDuration, unittest.equals(42));
     unittest.expect(o.maxStops, unittest.equals(42));
     unittest.expect(o.origin, unittest.equals('foo'));
-    checkUnnamed327(o.permittedCarrier);
+    checkUnnamed14(o.permittedCarrier);
     checkTimeOfDayRange(o.permittedDepartureTime);
     unittest.expect(o.preferredCabin, unittest.equals('foo'));
-    checkUnnamed328(o.prohibitedCarrier);
+    checkUnnamed15(o.prohibitedCarrier);
   }
   buildCounterSliceInput--;
 }
@@ -768,27 +768,27 @@
   buildCounterTimeOfDayRange--;
 }
 
-buildUnnamed329() {
+buildUnnamed16() {
   var o = new core.List<api.PricingInfo>();
   o.add(buildPricingInfo());
   o.add(buildPricingInfo());
   return o;
 }
 
-checkUnnamed329(core.List<api.PricingInfo> o) {
+checkUnnamed16(core.List<api.PricingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPricingInfo(o[0]);
   checkPricingInfo(o[1]);
 }
 
-buildUnnamed330() {
+buildUnnamed17() {
   var o = new core.List<api.SliceInfo>();
   o.add(buildSliceInfo());
   o.add(buildSliceInfo());
   return o;
 }
 
-checkUnnamed330(core.List<api.SliceInfo> o) {
+checkUnnamed17(core.List<api.SliceInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInfo(o[0]);
   checkSliceInfo(o[1]);
@@ -801,9 +801,9 @@
   if (buildCounterTripOption < 3) {
     o.id = "foo";
     o.kind = "foo";
-    o.pricing = buildUnnamed329();
+    o.pricing = buildUnnamed16();
     o.saleTotal = "foo";
-    o.slice = buildUnnamed330();
+    o.slice = buildUnnamed17();
   }
   buildCounterTripOption--;
   return o;
@@ -814,21 +814,21 @@
   if (buildCounterTripOption < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed329(o.pricing);
+    checkUnnamed16(o.pricing);
     unittest.expect(o.saleTotal, unittest.equals('foo'));
-    checkUnnamed330(o.slice);
+    checkUnnamed17(o.slice);
   }
   buildCounterTripOption--;
 }
 
-buildUnnamed331() {
+buildUnnamed18() {
   var o = new core.List<api.SliceInput>();
   o.add(buildSliceInput());
   o.add(buildSliceInput());
   return o;
 }
 
-checkUnnamed331(core.List<api.SliceInput> o) {
+checkUnnamed18(core.List<api.SliceInput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSliceInput(o[0]);
   checkSliceInput(o[1]);
@@ -843,7 +843,7 @@
     o.passengers = buildPassengerCounts();
     o.refundable = true;
     o.saleCountry = "foo";
-    o.slice = buildUnnamed331();
+    o.slice = buildUnnamed18();
     o.solutions = 42;
   }
   buildCounterTripOptionsRequest--;
@@ -857,20 +857,20 @@
     checkPassengerCounts(o.passengers);
     unittest.expect(o.refundable, unittest.isTrue);
     unittest.expect(o.saleCountry, unittest.equals('foo'));
-    checkUnnamed331(o.slice);
+    checkUnnamed18(o.slice);
     unittest.expect(o.solutions, unittest.equals(42));
   }
   buildCounterTripOptionsRequest--;
 }
 
-buildUnnamed332() {
+buildUnnamed19() {
   var o = new core.List<api.TripOption>();
   o.add(buildTripOption());
   o.add(buildTripOption());
   return o;
 }
 
-checkUnnamed332(core.List<api.TripOption> o) {
+checkUnnamed19(core.List<api.TripOption> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTripOption(o[0]);
   checkTripOption(o[1]);
@@ -884,7 +884,7 @@
     o.data = buildData();
     o.kind = "foo";
     o.requestId = "foo";
-    o.tripOption = buildUnnamed332();
+    o.tripOption = buildUnnamed19();
   }
   buildCounterTripOptionsResponse--;
   return o;
@@ -896,7 +896,7 @@
     checkData(o.data);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkUnnamed332(o.tripOption);
+    checkUnnamed19(o.tripOption);
   }
   buildCounterTripOptionsResponse--;
 }
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 3b3895a..1576396 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -136,6 +136,7 @@
   buildCounterSeats++;
   if (buildCounterSeats < 3) {
     o.kind = "foo";
+    o.licensedNumberOfSeats = 42;
     o.maximumNumberOfSeats = 42;
     o.numberOfSeats = 42;
   }
@@ -147,6 +148,7 @@
   buildCounterSeats++;
   if (buildCounterSeats < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.licensedNumberOfSeats, unittest.equals(42));
     unittest.expect(o.maximumNumberOfSeats, unittest.equals(42));
     unittest.expect(o.numberOfSeats, unittest.equals(42));
   }
@@ -282,14 +284,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed629() {
+buildUnnamed970() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed629(core.List<api.Subscription> o) {
+checkUnnamed970(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -302,7 +304,7 @@
   if (buildCounterSubscriptions < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed629();
+    o.subscriptions = buildUnnamed970();
   }
   buildCounterSubscriptions--;
   return o;
@@ -313,7 +315,7 @@
   if (buildCounterSubscriptions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed629(o.subscriptions);
+    checkUnnamed970(o.subscriptions);
   }
   buildCounterSubscriptions--;
 }
@@ -630,6 +632,67 @@
 
 
   unittest.group("resource-SubscriptionsResourceApi", () {
+    unittest.test("method--activate", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      var arg_customerId = "foo";
+      var arg_subscriptionId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        pathOffset += 10;
+        index = path.indexOf("/subscriptions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        pathOffset += 15;
+        index = path.indexOf("/activate", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/activate"));
+        pathOffset += 9;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSubscription());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.activate(arg_customerId, arg_subscriptionId).then(unittest.expectAsync(((api.Subscription response) {
+        checkSubscription(response);
+      })));
+    });
+
     unittest.test("method--changePlan", () {
 
       var mock = new common_test.HttpServerMock();
@@ -1114,6 +1177,67 @@
       })));
     });
 
+    unittest.test("method--suspend", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SubscriptionsResourceApi res = new api.ResellerApi(mock).subscriptions;
+      var arg_customerId = "foo";
+      var arg_subscriptionId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
+        pathOffset += 10;
+        index = path.indexOf("/subscriptions/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/subscriptions/"));
+        pathOffset += 15;
+        index = path.indexOf("/suspend", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/suspend"));
+        pathOffset += 8;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSubscription());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.suspend(arg_customerId, arg_subscriptionId).then(unittest.expectAsync(((api.Subscription response) {
+        checkSubscription(response);
+      })));
+    });
+
   });
 
 
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index 1256499..d20953b 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -79,14 +79,14 @@
   buildCounterSiteVerificationWebResourceGettokenResponse--;
 }
 
-buildUnnamed278() {
+buildUnnamed161() {
   var o = new core.List<api.SiteVerificationWebResourceResource>();
   o.add(buildSiteVerificationWebResourceResource());
   o.add(buildSiteVerificationWebResourceResource());
   return o;
 }
 
-checkUnnamed278(core.List<api.SiteVerificationWebResourceResource> o) {
+checkUnnamed161(core.List<api.SiteVerificationWebResourceResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteVerificationWebResourceResource(o[0]);
   checkSiteVerificationWebResourceResource(o[1]);
@@ -97,7 +97,7 @@
   var o = new api.SiteVerificationWebResourceListResponse();
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    o.items = buildUnnamed278();
+    o.items = buildUnnamed161();
   }
   buildCounterSiteVerificationWebResourceListResponse--;
   return o;
@@ -106,19 +106,19 @@
 checkSiteVerificationWebResourceListResponse(api.SiteVerificationWebResourceListResponse o) {
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    checkUnnamed278(o.items);
+    checkUnnamed161(o.items);
   }
   buildCounterSiteVerificationWebResourceListResponse--;
 }
 
-buildUnnamed279() {
+buildUnnamed162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed279(core.List<core.String> o) {
+checkUnnamed162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -151,7 +151,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     o.id = "foo";
-    o.owners = buildUnnamed279();
+    o.owners = buildUnnamed162();
     o.site = buildSiteVerificationWebResourceResourceSite();
   }
   buildCounterSiteVerificationWebResourceResource--;
@@ -162,7 +162,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed279(o.owners);
+    checkUnnamed162(o.owners);
     checkSiteVerificationWebResourceResourceSite(o.site);
   }
   buildCounterSiteVerificationWebResourceResource--;
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index 670a21a..6b47643 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed674() {
+buildUnnamed493() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed674(core.List<api.BucketAccessControl> o) {
+checkUnnamed493(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
 }
 
-buildUnnamed675() {
+buildUnnamed494() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed675(core.List<core.String> o) {
+checkUnnamed494(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed676() {
+buildUnnamed495() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed676(core.List<core.String> o) {
+checkUnnamed495(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed677() {
+buildUnnamed496() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed677(core.List<core.String> o) {
+checkUnnamed496(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -74,9 +74,9 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     o.maxAgeSeconds = 42;
-    o.method = buildUnnamed675();
-    o.origin = buildUnnamed676();
-    o.responseHeader = buildUnnamed677();
+    o.method = buildUnnamed494();
+    o.origin = buildUnnamed495();
+    o.responseHeader = buildUnnamed496();
   }
   buildCounterBucketCors--;
   return o;
@@ -86,34 +86,34 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     unittest.expect(o.maxAgeSeconds, unittest.equals(42));
-    checkUnnamed675(o.method);
-    checkUnnamed676(o.origin);
-    checkUnnamed677(o.responseHeader);
+    checkUnnamed494(o.method);
+    checkUnnamed495(o.origin);
+    checkUnnamed496(o.responseHeader);
   }
   buildCounterBucketCors--;
 }
 
-buildUnnamed678() {
+buildUnnamed497() {
   var o = new core.List<api.BucketCors>();
   o.add(buildBucketCors());
   o.add(buildBucketCors());
   return o;
 }
 
-checkUnnamed678(core.List<api.BucketCors> o) {
+checkUnnamed497(core.List<api.BucketCors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketCors(o[0]);
   checkBucketCors(o[1]);
 }
 
-buildUnnamed679() {
+buildUnnamed498() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed679(core.List<api.ObjectAccessControl> o) {
+checkUnnamed498(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
@@ -184,14 +184,14 @@
   buildCounterBucketLifecycleRule--;
 }
 
-buildUnnamed680() {
+buildUnnamed499() {
   var o = new core.List<api.BucketLifecycleRule>();
   o.add(buildBucketLifecycleRule());
   o.add(buildBucketLifecycleRule());
   return o;
 }
 
-checkUnnamed680(core.List<api.BucketLifecycleRule> o) {
+checkUnnamed499(core.List<api.BucketLifecycleRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketLifecycleRule(o[0]);
   checkBucketLifecycleRule(o[1]);
@@ -202,7 +202,7 @@
   var o = new api.BucketLifecycle();
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    o.rule = buildUnnamed680();
+    o.rule = buildUnnamed499();
   }
   buildCounterBucketLifecycle--;
   return o;
@@ -211,7 +211,7 @@
 checkBucketLifecycle(api.BucketLifecycle o) {
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    checkUnnamed680(o.rule);
+    checkUnnamed499(o.rule);
   }
   buildCounterBucketLifecycle--;
 }
@@ -303,9 +303,9 @@
   var o = new api.Bucket();
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    o.acl = buildUnnamed674();
-    o.cors = buildUnnamed678();
-    o.defaultObjectAcl = buildUnnamed679();
+    o.acl = buildUnnamed493();
+    o.cors = buildUnnamed497();
+    o.defaultObjectAcl = buildUnnamed498();
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -329,9 +329,9 @@
 checkBucket(api.Bucket o) {
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    checkUnnamed674(o.acl);
-    checkUnnamed678(o.cors);
-    checkUnnamed679(o.defaultObjectAcl);
+    checkUnnamed493(o.acl);
+    checkUnnamed497(o.cors);
+    checkUnnamed498(o.defaultObjectAcl);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -411,14 +411,14 @@
   buildCounterBucketAccessControl--;
 }
 
-buildUnnamed681() {
+buildUnnamed500() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed681(core.List<api.BucketAccessControl> o) {
+checkUnnamed500(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
@@ -429,7 +429,7 @@
   var o = new api.BucketAccessControls();
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    o.items = buildUnnamed681();
+    o.items = buildUnnamed500();
     o.kind = "foo";
   }
   buildCounterBucketAccessControls--;
@@ -439,20 +439,20 @@
 checkBucketAccessControls(api.BucketAccessControls o) {
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    checkUnnamed681(o.items);
+    checkUnnamed500(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBucketAccessControls--;
 }
 
-buildUnnamed682() {
+buildUnnamed501() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed682(core.List<api.Bucket> o) {
+checkUnnamed501(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -463,7 +463,7 @@
   var o = new api.Buckets();
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    o.items = buildUnnamed682();
+    o.items = buildUnnamed501();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -474,21 +474,21 @@
 checkBuckets(api.Buckets o) {
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    checkUnnamed682(o.items);
+    checkUnnamed501(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterBuckets--;
 }
 
-buildUnnamed683() {
+buildUnnamed502() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed683(core.Map<core.String, core.String> o) {
+checkUnnamed502(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -503,7 +503,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed683();
+    o.params = buildUnnamed502();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -521,7 +521,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed683(o.params);
+    checkUnnamed502(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -573,14 +573,14 @@
   buildCounterComposeRequestSourceObjects--;
 }
 
-buildUnnamed684() {
+buildUnnamed503() {
   var o = new core.List<api.ComposeRequestSourceObjects>();
   o.add(buildComposeRequestSourceObjects());
   o.add(buildComposeRequestSourceObjects());
   return o;
 }
 
-checkUnnamed684(core.List<api.ComposeRequestSourceObjects> o) {
+checkUnnamed503(core.List<api.ComposeRequestSourceObjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComposeRequestSourceObjects(o[0]);
   checkComposeRequestSourceObjects(o[1]);
@@ -593,7 +593,7 @@
   if (buildCounterComposeRequest < 3) {
     o.destination = buildObject();
     o.kind = "foo";
-    o.sourceObjects = buildUnnamed684();
+    o.sourceObjects = buildUnnamed503();
   }
   buildCounterComposeRequest--;
   return o;
@@ -604,32 +604,32 @@
   if (buildCounterComposeRequest < 3) {
     checkObject(o.destination);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed684(o.sourceObjects);
+    checkUnnamed503(o.sourceObjects);
   }
   buildCounterComposeRequest--;
 }
 
-buildUnnamed685() {
+buildUnnamed504() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed685(core.List<api.ObjectAccessControl> o) {
+checkUnnamed504(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
 }
 
-buildUnnamed686() {
+buildUnnamed505() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed686(core.Map<core.String, core.String> o) {
+checkUnnamed505(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -661,7 +661,7 @@
   var o = new api.Object();
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    o.acl = buildUnnamed685();
+    o.acl = buildUnnamed504();
     o.bucket = "foo";
     o.cacheControl = "foo";
     o.componentCount = 42;
@@ -676,7 +676,7 @@
     o.kind = "foo";
     o.md5Hash = "foo";
     o.mediaLink = "foo";
-    o.metadata = buildUnnamed686();
+    o.metadata = buildUnnamed505();
     o.metageneration = "foo";
     o.name = "foo";
     o.owner = buildObjectOwner();
@@ -693,7 +693,7 @@
 checkObject(api.Object o) {
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    checkUnnamed685(o.acl);
+    checkUnnamed504(o.acl);
     unittest.expect(o.bucket, unittest.equals('foo'));
     unittest.expect(o.cacheControl, unittest.equals('foo'));
     unittest.expect(o.componentCount, unittest.equals(42));
@@ -708,7 +708,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.md5Hash, unittest.equals('foo'));
     unittest.expect(o.mediaLink, unittest.equals('foo'));
-    checkUnnamed686(o.metadata);
+    checkUnnamed505(o.metadata);
     unittest.expect(o.metageneration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkObjectOwner(o.owner);
@@ -785,14 +785,14 @@
   buildCounterObjectAccessControl--;
 }
 
-buildUnnamed687() {
+buildUnnamed506() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed687(core.List<core.Object> o) {
+checkUnnamed506(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -803,7 +803,7 @@
   var o = new api.ObjectAccessControls();
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    o.items = buildUnnamed687();
+    o.items = buildUnnamed506();
     o.kind = "foo";
   }
   buildCounterObjectAccessControls--;
@@ -813,33 +813,33 @@
 checkObjectAccessControls(api.ObjectAccessControls o) {
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    checkUnnamed687(o.items);
+    checkUnnamed506(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterObjectAccessControls--;
 }
 
-buildUnnamed688() {
+buildUnnamed507() {
   var o = new core.List<api.Object>();
   o.add(buildObject());
   o.add(buildObject());
   return o;
 }
 
-checkUnnamed688(core.List<api.Object> o) {
+checkUnnamed507(core.List<api.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObject(o[0]);
   checkObject(o[1]);
 }
 
-buildUnnamed689() {
+buildUnnamed508() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed689(core.List<core.String> o) {
+checkUnnamed508(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -850,10 +850,10 @@
   var o = new api.Objects();
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    o.items = buildUnnamed688();
+    o.items = buildUnnamed507();
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.prefixes = buildUnnamed689();
+    o.prefixes = buildUnnamed508();
   }
   buildCounterObjects--;
   return o;
@@ -862,10 +862,10 @@
 checkObjects(api.Objects o) {
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    checkUnnamed688(o.items);
+    checkUnnamed507(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed689(o.prefixes);
+    checkUnnamed508(o.prefixes);
   }
   buildCounterObjects--;
 }
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index f641418..c570eaf 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -39,14 +39,14 @@
   buildCounterTaskLinks--;
 }
 
-buildUnnamed567() {
+buildUnnamed1086() {
   var o = new core.List<api.TaskLinks>();
   o.add(buildTaskLinks());
   o.add(buildTaskLinks());
   return o;
 }
 
-checkUnnamed567(core.List<api.TaskLinks> o) {
+checkUnnamed1086(core.List<api.TaskLinks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskLinks(o[0]);
   checkTaskLinks(o[1]);
@@ -64,7 +64,7 @@
     o.hidden = true;
     o.id = "foo";
     o.kind = "foo";
-    o.links = buildUnnamed567();
+    o.links = buildUnnamed1086();
     o.notes = "foo";
     o.parent = "foo";
     o.position = "foo";
@@ -87,7 +87,7 @@
     unittest.expect(o.hidden, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed567(o.links);
+    checkUnnamed1086(o.links);
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals('foo'));
@@ -128,14 +128,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed568() {
+buildUnnamed1087() {
   var o = new core.List<api.TaskList>();
   o.add(buildTaskList());
   o.add(buildTaskList());
   return o;
 }
 
-checkUnnamed568(core.List<api.TaskList> o) {
+checkUnnamed1087(core.List<api.TaskList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskList(o[0]);
   checkTaskList(o[1]);
@@ -147,7 +147,7 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed568();
+    o.items = buildUnnamed1087();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -159,21 +159,21 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed568(o.items);
+    checkUnnamed1087(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterTaskLists--;
 }
 
-buildUnnamed569() {
+buildUnnamed1088() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed569(core.List<api.Task> o) {
+checkUnnamed1088(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -185,7 +185,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed569();
+    o.items = buildUnnamed1088();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -197,7 +197,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed569(o.items);
+    checkUnnamed1088(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
diff --git a/generated/googleapis/test/translate/v2_test.dart b/generated/googleapis/test/translate/v2_test.dart
index 13a0943..de079ab 100644
--- a/generated/googleapis/test/translate/v2_test.dart
+++ b/generated/googleapis/test/translate/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed792() {
+buildUnnamed441() {
   var o = new core.List<api.DetectionsResource>();
   o.add(buildDetectionsResource());
   o.add(buildDetectionsResource());
   return o;
 }
 
-checkUnnamed792(core.List<api.DetectionsResource> o) {
+checkUnnamed441(core.List<api.DetectionsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDetectionsResource(o[0]);
   checkDetectionsResource(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.DetectionsListResponse();
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    o.detections = buildUnnamed792();
+    o.detections = buildUnnamed441();
   }
   buildCounterDetectionsListResponse--;
   return o;
@@ -43,7 +43,7 @@
 checkDetectionsListResponse(api.DetectionsListResponse o) {
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    checkUnnamed792(o.detections);
+    checkUnnamed441(o.detections);
   }
   buildCounterDetectionsListResponse--;
 }
@@ -84,14 +84,14 @@
   checkDetectionsResourceElement(o[1]);
 }
 
-buildUnnamed793() {
+buildUnnamed442() {
   var o = new core.List<api.LanguagesResource>();
   o.add(buildLanguagesResource());
   o.add(buildLanguagesResource());
   return o;
 }
 
-checkUnnamed793(core.List<api.LanguagesResource> o) {
+checkUnnamed442(core.List<api.LanguagesResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguagesResource(o[0]);
   checkLanguagesResource(o[1]);
@@ -102,7 +102,7 @@
   var o = new api.LanguagesListResponse();
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    o.languages = buildUnnamed793();
+    o.languages = buildUnnamed442();
   }
   buildCounterLanguagesListResponse--;
   return o;
@@ -111,7 +111,7 @@
 checkLanguagesListResponse(api.LanguagesListResponse o) {
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    checkUnnamed793(o.languages);
+    checkUnnamed442(o.languages);
   }
   buildCounterLanguagesListResponse--;
 }
@@ -137,14 +137,14 @@
   buildCounterLanguagesResource--;
 }
 
-buildUnnamed794() {
+buildUnnamed443() {
   var o = new core.List<api.TranslationsResource>();
   o.add(buildTranslationsResource());
   o.add(buildTranslationsResource());
   return o;
 }
 
-checkUnnamed794(core.List<api.TranslationsResource> o) {
+checkUnnamed443(core.List<api.TranslationsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTranslationsResource(o[0]);
   checkTranslationsResource(o[1]);
@@ -155,7 +155,7 @@
   var o = new api.TranslationsListResponse();
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    o.translations = buildUnnamed794();
+    o.translations = buildUnnamed443();
   }
   buildCounterTranslationsListResponse--;
   return o;
@@ -164,7 +164,7 @@
 checkTranslationsListResponse(api.TranslationsListResponse o) {
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    checkUnnamed794(o.translations);
+    checkUnnamed443(o.translations);
   }
   buildCounterTranslationsListResponse--;
 }
@@ -190,40 +190,40 @@
   buildCounterTranslationsResource--;
 }
 
-buildUnnamed795() {
+buildUnnamed444() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed795(core.List<core.String> o) {
+checkUnnamed444(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed796() {
+buildUnnamed445() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed796(core.List<core.String> o) {
+checkUnnamed445(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed797() {
+buildUnnamed446() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed797(core.List<core.String> o) {
+checkUnnamed446(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -299,7 +299,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.DetectionsResourceApi res = new api.TranslateApi(mock).detections;
-      var arg_q = buildUnnamed795();
+      var arg_q = buildUnnamed444();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
@@ -401,9 +401,9 @@
 
       var mock = new common_test.HttpServerMock();
       api.TranslationsResourceApi res = new api.TranslateApi(mock).translations;
-      var arg_q = buildUnnamed796();
+      var arg_q = buildUnnamed445();
       var arg_target = "foo";
-      var arg_cid = buildUnnamed797();
+      var arg_cid = buildUnnamed446();
       var arg_format = "foo";
       var arg_source = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
diff --git a/generated/googleapis/test/urlshortener/v1_test.dart b/generated/googleapis/test/urlshortener/v1_test.dart
index 17b68ba..d94406f 100644
--- a/generated/googleapis/test/urlshortener/v1_test.dart
+++ b/generated/googleapis/test/urlshortener/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed0() {
+buildUnnamed447() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed0(core.List<api.StringCount> o) {
+checkUnnamed447(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed1() {
+buildUnnamed448() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed1(core.List<api.StringCount> o) {
+checkUnnamed448(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed2() {
+buildUnnamed449() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed2(core.List<api.StringCount> o) {
+checkUnnamed449(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed3() {
+buildUnnamed450() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed3(core.List<api.StringCount> o) {
+checkUnnamed450(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
@@ -73,11 +73,11 @@
   var o = new api.AnalyticsSnapshot();
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    o.browsers = buildUnnamed0();
-    o.countries = buildUnnamed1();
+    o.browsers = buildUnnamed447();
+    o.countries = buildUnnamed448();
     o.longUrlClicks = "foo";
-    o.platforms = buildUnnamed2();
-    o.referrers = buildUnnamed3();
+    o.platforms = buildUnnamed449();
+    o.referrers = buildUnnamed450();
     o.shortUrlClicks = "foo";
   }
   buildCounterAnalyticsSnapshot--;
@@ -87,11 +87,11 @@
 checkAnalyticsSnapshot(api.AnalyticsSnapshot o) {
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    checkUnnamed0(o.browsers);
-    checkUnnamed1(o.countries);
+    checkUnnamed447(o.browsers);
+    checkUnnamed448(o.countries);
     unittest.expect(o.longUrlClicks, unittest.equals('foo'));
-    checkUnnamed2(o.platforms);
-    checkUnnamed3(o.referrers);
+    checkUnnamed449(o.platforms);
+    checkUnnamed450(o.referrers);
     unittest.expect(o.shortUrlClicks, unittest.equals('foo'));
   }
   buildCounterAnalyticsSnapshot--;
@@ -174,14 +174,14 @@
   buildCounterUrl--;
 }
 
-buildUnnamed4() {
+buildUnnamed451() {
   var o = new core.List<api.Url>();
   o.add(buildUrl());
   o.add(buildUrl());
   return o;
 }
 
-checkUnnamed4(core.List<api.Url> o) {
+checkUnnamed451(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrl(o[0]);
   checkUrl(o[1]);
@@ -192,7 +192,7 @@
   var o = new api.UrlHistory();
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    o.items = buildUnnamed4();
+    o.items = buildUnnamed451();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -205,7 +205,7 @@
 checkUrlHistory(api.UrlHistory o) {
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    checkUnnamed4(o.items);
+    checkUnnamed451(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 277175f..8f889ac 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed79() {
+buildUnnamed772() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed79(core.Map<core.String, core.String> o) {
+checkUnnamed772(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed80() {
+buildUnnamed773() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed80(core.List<core.String> o) {
+checkUnnamed773(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed81() {
+buildUnnamed774() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed81(core.List<core.String> o) {
+checkUnnamed774(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,11 +62,11 @@
   if (buildCounterWebfont < 3) {
     o.category = "foo";
     o.family = "foo";
-    o.files = buildUnnamed79();
+    o.files = buildUnnamed772();
     o.kind = "foo";
     o.lastModified = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.subsets = buildUnnamed80();
-    o.variants = buildUnnamed81();
+    o.subsets = buildUnnamed773();
+    o.variants = buildUnnamed774();
     o.version = "foo";
   }
   buildCounterWebfont--;
@@ -78,24 +78,24 @@
   if (buildCounterWebfont < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed79(o.files);
+    checkUnnamed772(o.files);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastModified, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed80(o.subsets);
-    checkUnnamed81(o.variants);
+    checkUnnamed773(o.subsets);
+    checkUnnamed774(o.variants);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterWebfont--;
 }
 
-buildUnnamed82() {
+buildUnnamed775() {
   var o = new core.List<api.Webfont>();
   o.add(buildWebfont());
   o.add(buildWebfont());
   return o;
 }
 
-checkUnnamed82(core.List<api.Webfont> o) {
+checkUnnamed775(core.List<api.Webfont> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebfont(o[0]);
   checkWebfont(o[1]);
@@ -106,7 +106,7 @@
   var o = new api.WebfontList();
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    o.items = buildUnnamed82();
+    o.items = buildUnnamed775();
     o.kind = "foo";
   }
   buildCounterWebfontList--;
@@ -116,7 +116,7 @@
 checkWebfontList(api.WebfontList o) {
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    checkUnnamed82(o.items);
+    checkUnnamed775(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWebfontList--;
diff --git a/generated/googleapis/test/webmasters/v3_test.dart b/generated/googleapis/test/webmasters/v3_test.dart
index c3db227..6c1d1a3 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed83() {
+buildUnnamed380() {
   var o = new core.List<api.WmxSitemap>();
   o.add(buildWmxSitemap());
   o.add(buildWmxSitemap());
   return o;
 }
 
-checkUnnamed83(core.List<api.WmxSitemap> o) {
+checkUnnamed380(core.List<api.WmxSitemap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemap(o[0]);
   checkWmxSitemap(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.SitemapsListResponse();
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    o.sitemap = buildUnnamed83();
+    o.sitemap = buildUnnamed380();
   }
   buildCounterSitemapsListResponse--;
   return o;
@@ -43,19 +43,19 @@
 checkSitemapsListResponse(api.SitemapsListResponse o) {
   buildCounterSitemapsListResponse++;
   if (buildCounterSitemapsListResponse < 3) {
-    checkUnnamed83(o.sitemap);
+    checkUnnamed380(o.sitemap);
   }
   buildCounterSitemapsListResponse--;
 }
 
-buildUnnamed84() {
+buildUnnamed381() {
   var o = new core.List<api.WmxSite>();
   o.add(buildWmxSite());
   o.add(buildWmxSite());
   return o;
 }
 
-checkUnnamed84(core.List<api.WmxSite> o) {
+checkUnnamed381(core.List<api.WmxSite> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSite(o[0]);
   checkWmxSite(o[1]);
@@ -66,7 +66,7 @@
   var o = new api.SitesListResponse();
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    o.siteEntry = buildUnnamed84();
+    o.siteEntry = buildUnnamed381();
   }
   buildCounterSitesListResponse--;
   return o;
@@ -75,7 +75,7 @@
 checkSitesListResponse(api.SitesListResponse o) {
   buildCounterSitesListResponse++;
   if (buildCounterSitesListResponse < 3) {
-    checkUnnamed84(o.siteEntry);
+    checkUnnamed381(o.siteEntry);
   }
   buildCounterSitesListResponse--;
 }
@@ -101,14 +101,14 @@
   buildCounterUrlCrawlErrorCount--;
 }
 
-buildUnnamed85() {
+buildUnnamed382() {
   var o = new core.List<api.UrlCrawlErrorCount>();
   o.add(buildUrlCrawlErrorCount());
   o.add(buildUrlCrawlErrorCount());
   return o;
 }
 
-checkUnnamed85(core.List<api.UrlCrawlErrorCount> o) {
+checkUnnamed382(core.List<api.UrlCrawlErrorCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCount(o[0]);
   checkUrlCrawlErrorCount(o[1]);
@@ -120,7 +120,7 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     o.category = "foo";
-    o.entries = buildUnnamed85();
+    o.entries = buildUnnamed382();
     o.platform = "foo";
   }
   buildCounterUrlCrawlErrorCountsPerType--;
@@ -131,20 +131,20 @@
   buildCounterUrlCrawlErrorCountsPerType++;
   if (buildCounterUrlCrawlErrorCountsPerType < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkUnnamed85(o.entries);
+    checkUnnamed382(o.entries);
     unittest.expect(o.platform, unittest.equals('foo'));
   }
   buildCounterUrlCrawlErrorCountsPerType--;
 }
 
-buildUnnamed86() {
+buildUnnamed383() {
   var o = new core.List<api.UrlCrawlErrorCountsPerType>();
   o.add(buildUrlCrawlErrorCountsPerType());
   o.add(buildUrlCrawlErrorCountsPerType());
   return o;
 }
 
-checkUnnamed86(core.List<api.UrlCrawlErrorCountsPerType> o) {
+checkUnnamed383(core.List<api.UrlCrawlErrorCountsPerType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorCountsPerType(o[0]);
   checkUrlCrawlErrorCountsPerType(o[1]);
@@ -155,7 +155,7 @@
   var o = new api.UrlCrawlErrorsCountsQueryResponse();
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    o.countPerTypes = buildUnnamed86();
+    o.countPerTypes = buildUnnamed383();
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
   return o;
@@ -164,7 +164,7 @@
 checkUrlCrawlErrorsCountsQueryResponse(api.UrlCrawlErrorsCountsQueryResponse o) {
   buildCounterUrlCrawlErrorsCountsQueryResponse++;
   if (buildCounterUrlCrawlErrorsCountsQueryResponse < 3) {
-    checkUnnamed86(o.countPerTypes);
+    checkUnnamed383(o.countPerTypes);
   }
   buildCounterUrlCrawlErrorsCountsQueryResponse--;
 }
@@ -196,14 +196,14 @@
   buildCounterUrlCrawlErrorsSample--;
 }
 
-buildUnnamed87() {
+buildUnnamed384() {
   var o = new core.List<api.UrlCrawlErrorsSample>();
   o.add(buildUrlCrawlErrorsSample());
   o.add(buildUrlCrawlErrorsSample());
   return o;
 }
 
-checkUnnamed87(core.List<api.UrlCrawlErrorsSample> o) {
+checkUnnamed384(core.List<api.UrlCrawlErrorsSample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlCrawlErrorsSample(o[0]);
   checkUrlCrawlErrorsSample(o[1]);
@@ -214,7 +214,7 @@
   var o = new api.UrlCrawlErrorsSamplesListResponse();
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    o.urlCrawlErrorSample = buildUnnamed87();
+    o.urlCrawlErrorSample = buildUnnamed384();
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
   return o;
@@ -223,32 +223,32 @@
 checkUrlCrawlErrorsSamplesListResponse(api.UrlCrawlErrorsSamplesListResponse o) {
   buildCounterUrlCrawlErrorsSamplesListResponse++;
   if (buildCounterUrlCrawlErrorsSamplesListResponse < 3) {
-    checkUnnamed87(o.urlCrawlErrorSample);
+    checkUnnamed384(o.urlCrawlErrorSample);
   }
   buildCounterUrlCrawlErrorsSamplesListResponse--;
 }
 
-buildUnnamed88() {
+buildUnnamed385() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed88(core.List<core.String> o) {
+checkUnnamed385(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed89() {
+buildUnnamed386() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed89(core.List<core.String> o) {
+checkUnnamed386(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -259,8 +259,8 @@
   var o = new api.UrlSampleDetails();
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    o.containingSitemaps = buildUnnamed88();
-    o.linkedFromUrls = buildUnnamed89();
+    o.containingSitemaps = buildUnnamed385();
+    o.linkedFromUrls = buildUnnamed386();
   }
   buildCounterUrlSampleDetails--;
   return o;
@@ -269,8 +269,8 @@
 checkUrlSampleDetails(api.UrlSampleDetails o) {
   buildCounterUrlSampleDetails++;
   if (buildCounterUrlSampleDetails < 3) {
-    checkUnnamed88(o.containingSitemaps);
-    checkUnnamed89(o.linkedFromUrls);
+    checkUnnamed385(o.containingSitemaps);
+    checkUnnamed386(o.linkedFromUrls);
   }
   buildCounterUrlSampleDetails--;
 }
@@ -296,14 +296,14 @@
   buildCounterWmxSite--;
 }
 
-buildUnnamed90() {
+buildUnnamed387() {
   var o = new core.List<api.WmxSitemapContent>();
   o.add(buildWmxSitemapContent());
   o.add(buildWmxSitemapContent());
   return o;
 }
 
-checkUnnamed90(core.List<api.WmxSitemapContent> o) {
+checkUnnamed387(core.List<api.WmxSitemapContent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWmxSitemapContent(o[0]);
   checkWmxSitemapContent(o[1]);
@@ -314,7 +314,7 @@
   var o = new api.WmxSitemap();
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    o.contents = buildUnnamed90();
+    o.contents = buildUnnamed387();
     o.errors = "foo";
     o.isPending = true;
     o.isSitemapsIndex = true;
@@ -331,7 +331,7 @@
 checkWmxSitemap(api.WmxSitemap o) {
   buildCounterWmxSitemap++;
   if (buildCounterWmxSitemap < 3) {
-    checkUnnamed90(o.contents);
+    checkUnnamed387(o.contents);
     unittest.expect(o.errors, unittest.equals('foo'));
     unittest.expect(o.isPending, unittest.isTrue);
     unittest.expect(o.isSitemapsIndex, unittest.isTrue);
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index 95b30d8..41c15d4 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed987() {
+buildUnnamed337() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed987(core.List<core.String> o) {
+checkUnnamed337(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -35,7 +35,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     o.allowed = true;
-    o.exception = buildUnnamed987();
+    o.exception = buildUnnamed337();
   }
   buildCounterAccessPolicy--;
   return o;
@@ -45,7 +45,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     unittest.expect(o.allowed, unittest.isTrue);
-    checkUnnamed987(o.exception);
+    checkUnnamed337(o.exception);
   }
   buildCounterAccessPolicy--;
 }
@@ -234,27 +234,27 @@
   buildCounterActivityContentDetailsPlaylistItem--;
 }
 
-buildUnnamed988() {
+buildUnnamed338() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed988(core.List<core.String> o) {
+checkUnnamed338(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed989() {
+buildUnnamed339() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed989(core.List<core.String> o) {
+checkUnnamed339(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -272,8 +272,8 @@
     o.customCtaButtonText = "foo";
     o.descriptionText = "foo";
     o.destinationUrl = "foo";
-    o.forecastingUrl = buildUnnamed988();
-    o.impressionUrl = buildUnnamed989();
+    o.forecastingUrl = buildUnnamed338();
+    o.impressionUrl = buildUnnamed339();
     o.videoId = "foo";
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -290,8 +290,8 @@
     unittest.expect(o.customCtaButtonText, unittest.equals('foo'));
     unittest.expect(o.descriptionText, unittest.equals('foo'));
     unittest.expect(o.destinationUrl, unittest.equals('foo'));
-    checkUnnamed988(o.forecastingUrl);
-    checkUnnamed989(o.impressionUrl);
+    checkUnnamed338(o.forecastingUrl);
+    checkUnnamed339(o.impressionUrl);
     unittest.expect(o.videoId, unittest.equals('foo'));
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -385,14 +385,14 @@
   buildCounterActivityContentDetailsUpload--;
 }
 
-buildUnnamed990() {
+buildUnnamed340() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed990(core.List<api.Activity> o) {
+checkUnnamed340(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -405,7 +405,7 @@
   if (buildCounterActivityListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed990();
+    o.items = buildUnnamed340();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -422,7 +422,7 @@
   if (buildCounterActivityListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed990(o.items);
+    checkUnnamed340(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -580,14 +580,14 @@
   buildCounterChannelBannerResource--;
 }
 
-buildUnnamed991() {
+buildUnnamed341() {
   var o = new core.List<api.PropertyValue>();
   o.add(buildPropertyValue());
   o.add(buildPropertyValue());
   return o;
 }
 
-checkUnnamed991(core.List<api.PropertyValue> o) {
+checkUnnamed341(core.List<api.PropertyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyValue(o[0]);
   checkPropertyValue(o[1]);
@@ -599,7 +599,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     o.channel = buildChannelSettings();
-    o.hints = buildUnnamed991();
+    o.hints = buildUnnamed341();
     o.image = buildImageSettings();
     o.watch = buildWatchSettings();
   }
@@ -611,7 +611,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     checkChannelSettings(o.channel);
-    checkUnnamed991(o.hints);
+    checkUnnamed341(o.hints);
     checkImageSettings(o.image);
     checkWatchSettings(o.watch);
   }
@@ -708,14 +708,14 @@
   buildCounterChannelConversionPing--;
 }
 
-buildUnnamed992() {
+buildUnnamed342() {
   var o = new core.List<api.ChannelConversionPing>();
   o.add(buildChannelConversionPing());
   o.add(buildChannelConversionPing());
   return o;
 }
 
-checkUnnamed992(core.List<api.ChannelConversionPing> o) {
+checkUnnamed342(core.List<api.ChannelConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelConversionPing(o[0]);
   checkChannelConversionPing(o[1]);
@@ -726,7 +726,7 @@
   var o = new api.ChannelConversionPings();
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    o.pings = buildUnnamed992();
+    o.pings = buildUnnamed342();
   }
   buildCounterChannelConversionPings--;
   return o;
@@ -735,19 +735,19 @@
 checkChannelConversionPings(api.ChannelConversionPings o) {
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    checkUnnamed992(o.pings);
+    checkUnnamed342(o.pings);
   }
   buildCounterChannelConversionPings--;
 }
 
-buildUnnamed993() {
+buildUnnamed343() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed993(core.List<api.Channel> o) {
+checkUnnamed343(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -760,7 +760,7 @@
   if (buildCounterChannelListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed993();
+    o.items = buildUnnamed343();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -777,7 +777,7 @@
   if (buildCounterChannelListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed993(o.items);
+    checkUnnamed343(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -815,27 +815,27 @@
   buildCounterChannelSection--;
 }
 
-buildUnnamed994() {
+buildUnnamed344() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed994(core.List<core.String> o) {
+checkUnnamed344(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed995() {
+buildUnnamed345() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed995(core.List<core.String> o) {
+checkUnnamed345(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -846,8 +846,8 @@
   var o = new api.ChannelSectionContentDetails();
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    o.channels = buildUnnamed994();
-    o.playlists = buildUnnamed995();
+    o.channels = buildUnnamed344();
+    o.playlists = buildUnnamed345();
   }
   buildCounterChannelSectionContentDetails--;
   return o;
@@ -856,20 +856,20 @@
 checkChannelSectionContentDetails(api.ChannelSectionContentDetails o) {
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    checkUnnamed994(o.channels);
-    checkUnnamed995(o.playlists);
+    checkUnnamed344(o.channels);
+    checkUnnamed345(o.playlists);
   }
   buildCounterChannelSectionContentDetails--;
 }
 
-buildUnnamed996() {
+buildUnnamed346() {
   var o = new core.List<api.ChannelSection>();
   o.add(buildChannelSection());
   o.add(buildChannelSection());
   return o;
 }
 
-checkUnnamed996(core.List<api.ChannelSection> o) {
+checkUnnamed346(core.List<api.ChannelSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSection(o[0]);
   checkChannelSection(o[1]);
@@ -882,7 +882,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed996();
+    o.items = buildUnnamed346();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -895,7 +895,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed996(o.items);
+    checkUnnamed346(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -929,14 +929,14 @@
   buildCounterChannelSectionSnippet--;
 }
 
-buildUnnamed997() {
+buildUnnamed347() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed997(core.List<core.String> o) {
+checkUnnamed347(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -950,7 +950,7 @@
     o.defaultTab = "foo";
     o.description = "foo";
     o.featuredChannelsTitle = "foo";
-    o.featuredChannelsUrls = buildUnnamed997();
+    o.featuredChannelsUrls = buildUnnamed347();
     o.keywords = "foo";
     o.moderateComments = true;
     o.profileColor = "foo";
@@ -970,7 +970,7 @@
     unittest.expect(o.defaultTab, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.featuredChannelsTitle, unittest.equals('foo'));
-    checkUnnamed997(o.featuredChannelsUrls);
+    checkUnnamed347(o.featuredChannelsUrls);
     unittest.expect(o.keywords, unittest.equals('foo'));
     unittest.expect(o.moderateComments, unittest.isTrue);
     unittest.expect(o.profileColor, unittest.equals('foo'));
@@ -1058,14 +1058,14 @@
   buildCounterChannelStatus--;
 }
 
-buildUnnamed998() {
+buildUnnamed348() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed998(core.List<core.String> o) {
+checkUnnamed348(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1076,7 +1076,7 @@
   var o = new api.ChannelTopicDetails();
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    o.topicIds = buildUnnamed998();
+    o.topicIds = buildUnnamed348();
   }
   buildCounterChannelTopicDetails--;
   return o;
@@ -1085,7 +1085,7 @@
 checkChannelTopicDetails(api.ChannelTopicDetails o) {
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    checkUnnamed998(o.topicIds);
+    checkUnnamed348(o.topicIds);
   }
   buildCounterChannelTopicDetails--;
 }
@@ -1281,14 +1281,14 @@
   buildCounterGuideCategory--;
 }
 
-buildUnnamed999() {
+buildUnnamed349() {
   var o = new core.List<api.GuideCategory>();
   o.add(buildGuideCategory());
   o.add(buildGuideCategory());
   return o;
 }
 
-checkUnnamed999(core.List<api.GuideCategory> o) {
+checkUnnamed349(core.List<api.GuideCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuideCategory(o[0]);
   checkGuideCategory(o[1]);
@@ -1301,7 +1301,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed999();
+    o.items = buildUnnamed349();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1318,7 +1318,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed999(o.items);
+    checkUnnamed349(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1375,14 +1375,14 @@
   buildCounterI18nLanguage--;
 }
 
-buildUnnamed1000() {
+buildUnnamed350() {
   var o = new core.List<api.I18nLanguage>();
   o.add(buildI18nLanguage());
   o.add(buildI18nLanguage());
   return o;
 }
 
-checkUnnamed1000(core.List<api.I18nLanguage> o) {
+checkUnnamed350(core.List<api.I18nLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nLanguage(o[0]);
   checkI18nLanguage(o[1]);
@@ -1395,7 +1395,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1000();
+    o.items = buildUnnamed350();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1408,7 +1408,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1000(o.items);
+    checkUnnamed350(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1461,14 +1461,14 @@
   buildCounterI18nRegion--;
 }
 
-buildUnnamed1001() {
+buildUnnamed351() {
   var o = new core.List<api.I18nRegion>();
   o.add(buildI18nRegion());
   o.add(buildI18nRegion());
   return o;
 }
 
-checkUnnamed1001(core.List<api.I18nRegion> o) {
+checkUnnamed351(core.List<api.I18nRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nRegion(o[0]);
   checkI18nRegion(o[1]);
@@ -1481,7 +1481,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1001();
+    o.items = buildUnnamed351();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1494,7 +1494,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1001(o.items);
+    checkUnnamed351(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1654,14 +1654,14 @@
   buildCounterInvideoPosition--;
 }
 
-buildUnnamed1002() {
+buildUnnamed352() {
   var o = new core.List<api.PromotedItem>();
   o.add(buildPromotedItem());
   o.add(buildPromotedItem());
   return o;
 }
 
-checkUnnamed1002(core.List<api.PromotedItem> o) {
+checkUnnamed352(core.List<api.PromotedItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotedItem(o[0]);
   checkPromotedItem(o[1]);
@@ -1673,7 +1673,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     o.defaultTiming = buildInvideoTiming();
-    o.items = buildUnnamed1002();
+    o.items = buildUnnamed352();
     o.position = buildInvideoPosition();
     o.useSmartTiming = true;
   }
@@ -1685,7 +1685,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     checkInvideoTiming(o.defaultTiming);
-    checkUnnamed1002(o.items);
+    checkUnnamed352(o.items);
     checkInvideoPosition(o.position);
     unittest.expect(o.useSmartTiming, unittest.isTrue);
   }
@@ -1777,14 +1777,14 @@
   buildCounterLiveBroadcastContentDetails--;
 }
 
-buildUnnamed1003() {
+buildUnnamed353() {
   var o = new core.List<api.LiveBroadcast>();
   o.add(buildLiveBroadcast());
   o.add(buildLiveBroadcast());
   return o;
 }
 
-checkUnnamed1003(core.List<api.LiveBroadcast> o) {
+checkUnnamed353(core.List<api.LiveBroadcast> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveBroadcast(o[0]);
   checkLiveBroadcast(o[1]);
@@ -1797,7 +1797,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1003();
+    o.items = buildUnnamed353();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1814,7 +1814,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1003(o.items);
+    checkUnnamed353(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1937,14 +1937,14 @@
   buildCounterLiveStreamContentDetails--;
 }
 
-buildUnnamed1004() {
+buildUnnamed354() {
   var o = new core.List<api.LiveStream>();
   o.add(buildLiveStream());
   o.add(buildLiveStream());
   return o;
 }
 
-checkUnnamed1004(core.List<api.LiveStream> o) {
+checkUnnamed354(core.List<api.LiveStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStream(o[0]);
   checkLiveStream(o[1]);
@@ -1957,7 +1957,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1004();
+    o.items = buildUnnamed354();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1974,7 +1974,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1004(o.items);
+    checkUnnamed354(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2029,14 +2029,14 @@
   buildCounterLiveStreamStatus--;
 }
 
-buildUnnamed1005() {
+buildUnnamed355() {
   var o = new core.List<api.LocalizedString>();
   o.add(buildLocalizedString());
   o.add(buildLocalizedString());
   return o;
 }
 
-checkUnnamed1005(core.List<api.LocalizedString> o) {
+checkUnnamed355(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedString(o[0]);
   checkLocalizedString(o[1]);
@@ -2048,7 +2048,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     o.default_ = "foo";
-    o.localized = buildUnnamed1005();
+    o.localized = buildUnnamed355();
   }
   buildCounterLocalizedProperty--;
   return o;
@@ -2058,7 +2058,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     unittest.expect(o.default_, unittest.equals('foo'));
-    checkUnnamed1005(o.localized);
+    checkUnnamed355(o.localized);
   }
   buildCounterLocalizedProperty--;
 }
@@ -2232,14 +2232,14 @@
   buildCounterPlaylistItemContentDetails--;
 }
 
-buildUnnamed1006() {
+buildUnnamed356() {
   var o = new core.List<api.PlaylistItem>();
   o.add(buildPlaylistItem());
   o.add(buildPlaylistItem());
   return o;
 }
 
-checkUnnamed1006(core.List<api.PlaylistItem> o) {
+checkUnnamed356(core.List<api.PlaylistItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistItem(o[0]);
   checkPlaylistItem(o[1]);
@@ -2252,7 +2252,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1006();
+    o.items = buildUnnamed356();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2269,7 +2269,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1006(o.items);
+    checkUnnamed356(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2334,14 +2334,14 @@
   buildCounterPlaylistItemStatus--;
 }
 
-buildUnnamed1007() {
+buildUnnamed357() {
   var o = new core.List<api.Playlist>();
   o.add(buildPlaylist());
   o.add(buildPlaylist());
   return o;
 }
 
-checkUnnamed1007(core.List<api.Playlist> o) {
+checkUnnamed357(core.List<api.Playlist> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylist(o[0]);
   checkPlaylist(o[1]);
@@ -2354,7 +2354,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1007();
+    o.items = buildUnnamed357();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2371,7 +2371,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1007(o.items);
+    checkUnnamed357(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2401,14 +2401,14 @@
   buildCounterPlaylistPlayer--;
 }
 
-buildUnnamed1008() {
+buildUnnamed358() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1008(core.List<core.String> o) {
+checkUnnamed358(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2423,7 +2423,7 @@
     o.channelTitle = "foo";
     o.description = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed1008();
+    o.tags = buildUnnamed358();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -2438,7 +2438,7 @@
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1008(o.tags);
+    checkUnnamed358(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -2560,14 +2560,14 @@
   buildCounterResourceId--;
 }
 
-buildUnnamed1009() {
+buildUnnamed359() {
   var o = new core.List<api.SearchResult>();
   o.add(buildSearchResult());
   o.add(buildSearchResult());
   return o;
 }
 
-checkUnnamed1009(core.List<api.SearchResult> o) {
+checkUnnamed359(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSearchResult(o[0]);
   checkSearchResult(o[1]);
@@ -2580,7 +2580,7 @@
   if (buildCounterSearchListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1009();
+    o.items = buildUnnamed359();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2597,7 +2597,7 @@
   if (buildCounterSearchListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1009(o.items);
+    checkUnnamed359(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2716,14 +2716,14 @@
   buildCounterSubscriptionContentDetails--;
 }
 
-buildUnnamed1010() {
+buildUnnamed360() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1010(core.List<api.Subscription> o) {
+checkUnnamed360(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -2736,7 +2736,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1010();
+    o.items = buildUnnamed360();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2753,7 +2753,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1010(o.items);
+    checkUnnamed360(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2870,14 +2870,14 @@
   buildCounterThumbnailDetails--;
 }
 
-buildUnnamed1011() {
+buildUnnamed361() {
   var o = new core.List<api.ThumbnailDetails>();
   o.add(buildThumbnailDetails());
   o.add(buildThumbnailDetails());
   return o;
 }
 
-checkUnnamed1011(core.List<api.ThumbnailDetails> o) {
+checkUnnamed361(core.List<api.ThumbnailDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThumbnailDetails(o[0]);
   checkThumbnailDetails(o[1]);
@@ -2890,7 +2890,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1011();
+    o.items = buildUnnamed361();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2903,7 +2903,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1011(o.items);
+    checkUnnamed361(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -3028,14 +3028,14 @@
   buildCounterVideoCategory--;
 }
 
-buildUnnamed1012() {
+buildUnnamed362() {
   var o = new core.List<api.VideoCategory>();
   o.add(buildVideoCategory());
   o.add(buildVideoCategory());
   return o;
 }
 
-checkUnnamed1012(core.List<api.VideoCategory> o) {
+checkUnnamed362(core.List<api.VideoCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoCategory(o[0]);
   checkVideoCategory(o[1]);
@@ -3048,7 +3048,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1012();
+    o.items = buildUnnamed362();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3065,7 +3065,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1012(o.items);
+    checkUnnamed362(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3132,27 +3132,27 @@
   buildCounterVideoContentDetails--;
 }
 
-buildUnnamed1013() {
+buildUnnamed363() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1013(core.List<core.String> o) {
+checkUnnamed363(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1014() {
+buildUnnamed364() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1014(core.List<core.String> o) {
+checkUnnamed364(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3163,8 +3163,8 @@
   var o = new api.VideoContentDetailsRegionRestriction();
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    o.allowed = buildUnnamed1013();
-    o.blocked = buildUnnamed1014();
+    o.allowed = buildUnnamed363();
+    o.blocked = buildUnnamed364();
   }
   buildCounterVideoContentDetailsRegionRestriction--;
   return o;
@@ -3173,8 +3173,8 @@
 checkVideoContentDetailsRegionRestriction(api.VideoContentDetailsRegionRestriction o) {
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    checkUnnamed1013(o.allowed);
-    checkUnnamed1014(o.blocked);
+    checkUnnamed363(o.allowed);
+    checkUnnamed364(o.blocked);
   }
   buildCounterVideoContentDetailsRegionRestriction--;
 }
@@ -3200,14 +3200,14 @@
   buildCounterVideoConversionPing--;
 }
 
-buildUnnamed1015() {
+buildUnnamed365() {
   var o = new core.List<api.VideoConversionPing>();
   o.add(buildVideoConversionPing());
   o.add(buildVideoConversionPing());
   return o;
 }
 
-checkUnnamed1015(core.List<api.VideoConversionPing> o) {
+checkUnnamed365(core.List<api.VideoConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoConversionPing(o[0]);
   checkVideoConversionPing(o[1]);
@@ -3218,7 +3218,7 @@
   var o = new api.VideoConversionPings();
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    o.pings = buildUnnamed1015();
+    o.pings = buildUnnamed365();
   }
   buildCounterVideoConversionPings--;
   return o;
@@ -3227,32 +3227,32 @@
 checkVideoConversionPings(api.VideoConversionPings o) {
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    checkUnnamed1015(o.pings);
+    checkUnnamed365(o.pings);
   }
   buildCounterVideoConversionPings--;
 }
 
-buildUnnamed1016() {
+buildUnnamed366() {
   var o = new core.List<api.VideoFileDetailsAudioStream>();
   o.add(buildVideoFileDetailsAudioStream());
   o.add(buildVideoFileDetailsAudioStream());
   return o;
 }
 
-checkUnnamed1016(core.List<api.VideoFileDetailsAudioStream> o) {
+checkUnnamed366(core.List<api.VideoFileDetailsAudioStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsAudioStream(o[0]);
   checkVideoFileDetailsAudioStream(o[1]);
 }
 
-buildUnnamed1017() {
+buildUnnamed367() {
   var o = new core.List<api.VideoFileDetailsVideoStream>();
   o.add(buildVideoFileDetailsVideoStream());
   o.add(buildVideoFileDetailsVideoStream());
   return o;
 }
 
-checkUnnamed1017(core.List<api.VideoFileDetailsVideoStream> o) {
+checkUnnamed367(core.List<api.VideoFileDetailsVideoStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsVideoStream(o[0]);
   checkVideoFileDetailsVideoStream(o[1]);
@@ -3263,7 +3263,7 @@
   var o = new api.VideoFileDetails();
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    o.audioStreams = buildUnnamed1016();
+    o.audioStreams = buildUnnamed366();
     o.bitrateBps = "foo";
     o.container = "foo";
     o.creationTime = "foo";
@@ -3272,7 +3272,7 @@
     o.fileSize = "foo";
     o.fileType = "foo";
     o.recordingLocation = buildGeoPoint();
-    o.videoStreams = buildUnnamed1017();
+    o.videoStreams = buildUnnamed367();
   }
   buildCounterVideoFileDetails--;
   return o;
@@ -3281,7 +3281,7 @@
 checkVideoFileDetails(api.VideoFileDetails o) {
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    checkUnnamed1016(o.audioStreams);
+    checkUnnamed366(o.audioStreams);
     unittest.expect(o.bitrateBps, unittest.equals('foo'));
     unittest.expect(o.container, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
@@ -3290,7 +3290,7 @@
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.fileType, unittest.equals('foo'));
     checkGeoPoint(o.recordingLocation);
-    checkUnnamed1017(o.videoStreams);
+    checkUnnamed367(o.videoStreams);
   }
   buildCounterVideoFileDetails--;
 }
@@ -3353,14 +3353,14 @@
   buildCounterVideoFileDetailsVideoStream--;
 }
 
-buildUnnamed1018() {
+buildUnnamed368() {
   var o = new core.List<api.VideoRating>();
   o.add(buildVideoRating());
   o.add(buildVideoRating());
   return o;
 }
 
-checkUnnamed1018(core.List<api.VideoRating> o) {
+checkUnnamed368(core.List<api.VideoRating> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoRating(o[0]);
   checkVideoRating(o[1]);
@@ -3372,7 +3372,7 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1018();
+    o.items = buildUnnamed368();
     o.kind = "foo";
   }
   buildCounterVideoGetRatingResponse--;
@@ -3383,20 +3383,20 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1018(o.items);
+    checkUnnamed368(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVideoGetRatingResponse--;
 }
 
-buildUnnamed1019() {
+buildUnnamed369() {
   var o = new core.List<api.Video>();
   o.add(buildVideo());
   o.add(buildVideo());
   return o;
 }
 
-checkUnnamed1019(core.List<api.Video> o) {
+checkUnnamed369(core.List<api.Video> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideo(o[0]);
   checkVideo(o[1]);
@@ -3409,7 +3409,7 @@
   if (buildCounterVideoListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed1019();
+    o.items = buildUnnamed369();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3426,7 +3426,7 @@
   if (buildCounterVideoListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed1019(o.items);
+    checkUnnamed369(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3558,14 +3558,14 @@
   buildCounterVideoProcessingDetailsProcessingProgress--;
 }
 
-buildUnnamed1020() {
+buildUnnamed370() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1020(core.List<core.String> o) {
+checkUnnamed370(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3576,7 +3576,7 @@
   var o = new api.VideoProjectDetails();
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    o.tags = buildUnnamed1020();
+    o.tags = buildUnnamed370();
   }
   buildCounterVideoProjectDetails--;
   return o;
@@ -3585,7 +3585,7 @@
 checkVideoProjectDetails(api.VideoProjectDetails o) {
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    checkUnnamed1020(o.tags);
+    checkUnnamed370(o.tags);
   }
   buildCounterVideoProjectDetails--;
 }
@@ -3634,14 +3634,14 @@
   buildCounterVideoRecordingDetails--;
 }
 
-buildUnnamed1021() {
+buildUnnamed371() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1021(core.List<core.String> o) {
+checkUnnamed371(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3658,7 +3658,7 @@
     o.description = "foo";
     o.liveBroadcastContent = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed1021();
+    o.tags = buildUnnamed371();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -3675,7 +3675,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.liveBroadcastContent, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1021(o.tags);
+    checkUnnamed371(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -3742,66 +3742,66 @@
   buildCounterVideoStatus--;
 }
 
-buildUnnamed1022() {
+buildUnnamed372() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1022(core.List<core.String> o) {
+checkUnnamed372(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1023() {
+buildUnnamed373() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1023(core.List<core.String> o) {
+checkUnnamed373(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1024() {
+buildUnnamed374() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1024(core.List<core.String> o) {
+checkUnnamed374(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1025() {
+buildUnnamed375() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1025(core.List<core.String> o) {
+checkUnnamed375(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1026() {
+buildUnnamed376() {
   var o = new core.List<api.VideoSuggestionsTagSuggestion>();
   o.add(buildVideoSuggestionsTagSuggestion());
   o.add(buildVideoSuggestionsTagSuggestion());
   return o;
 }
 
-checkUnnamed1026(core.List<api.VideoSuggestionsTagSuggestion> o) {
+checkUnnamed376(core.List<api.VideoSuggestionsTagSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoSuggestionsTagSuggestion(o[0]);
   checkVideoSuggestionsTagSuggestion(o[1]);
@@ -3812,11 +3812,11 @@
   var o = new api.VideoSuggestions();
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    o.editorSuggestions = buildUnnamed1022();
-    o.processingErrors = buildUnnamed1023();
-    o.processingHints = buildUnnamed1024();
-    o.processingWarnings = buildUnnamed1025();
-    o.tagSuggestions = buildUnnamed1026();
+    o.editorSuggestions = buildUnnamed372();
+    o.processingErrors = buildUnnamed373();
+    o.processingHints = buildUnnamed374();
+    o.processingWarnings = buildUnnamed375();
+    o.tagSuggestions = buildUnnamed376();
   }
   buildCounterVideoSuggestions--;
   return o;
@@ -3825,23 +3825,23 @@
 checkVideoSuggestions(api.VideoSuggestions o) {
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    checkUnnamed1022(o.editorSuggestions);
-    checkUnnamed1023(o.processingErrors);
-    checkUnnamed1024(o.processingHints);
-    checkUnnamed1025(o.processingWarnings);
-    checkUnnamed1026(o.tagSuggestions);
+    checkUnnamed372(o.editorSuggestions);
+    checkUnnamed373(o.processingErrors);
+    checkUnnamed374(o.processingHints);
+    checkUnnamed375(o.processingWarnings);
+    checkUnnamed376(o.tagSuggestions);
   }
   buildCounterVideoSuggestions--;
 }
 
-buildUnnamed1027() {
+buildUnnamed377() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1027(core.List<core.String> o) {
+checkUnnamed377(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3852,7 +3852,7 @@
   var o = new api.VideoSuggestionsTagSuggestion();
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    o.categoryRestricts = buildUnnamed1027();
+    o.categoryRestricts = buildUnnamed377();
     o.tag = "foo";
   }
   buildCounterVideoSuggestionsTagSuggestion--;
@@ -3862,33 +3862,33 @@
 checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    checkUnnamed1027(o.categoryRestricts);
+    checkUnnamed377(o.categoryRestricts);
     unittest.expect(o.tag, unittest.equals('foo'));
   }
   buildCounterVideoSuggestionsTagSuggestion--;
 }
 
-buildUnnamed1028() {
+buildUnnamed378() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1028(core.List<core.String> o) {
+checkUnnamed378(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1029() {
+buildUnnamed379() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1029(core.List<core.String> o) {
+checkUnnamed379(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3899,8 +3899,8 @@
   var o = new api.VideoTopicDetails();
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    o.relevantTopicIds = buildUnnamed1028();
-    o.topicIds = buildUnnamed1029();
+    o.relevantTopicIds = buildUnnamed378();
+    o.topicIds = buildUnnamed379();
   }
   buildCounterVideoTopicDetails--;
   return o;
@@ -3909,8 +3909,8 @@
 checkVideoTopicDetails(api.VideoTopicDetails o) {
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    checkUnnamed1028(o.relevantTopicIds);
-    checkUnnamed1029(o.topicIds);
+    checkUnnamed378(o.relevantTopicIds);
+    checkUnnamed379(o.topicIds);
   }
   buildCounterVideoTopicDetails--;
 }
diff --git a/generated/googleapis/test/youtubeanalytics/v1_test.dart b/generated/googleapis/test/youtubeanalytics/v1_test.dart
index f6ba72e..b958768 100644
--- a/generated/googleapis/test/youtubeanalytics/v1_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed815() {
+buildUnnamed180() {
   var o = new core.List<api.BatchReportDefinitionTemplate>();
   o.add(buildBatchReportDefinitionTemplate());
   o.add(buildBatchReportDefinitionTemplate());
   return o;
 }
 
-checkUnnamed815(core.List<api.BatchReportDefinitionTemplate> o) {
+checkUnnamed180(core.List<api.BatchReportDefinitionTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportDefinitionTemplate(o[0]);
   checkBatchReportDefinitionTemplate(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.BatchReportDefinitionList();
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    o.items = buildUnnamed815();
+    o.items = buildUnnamed180();
     o.kind = "foo";
   }
   buildCounterBatchReportDefinitionList--;
@@ -44,7 +44,7 @@
 checkBatchReportDefinitionList(api.BatchReportDefinitionList o) {
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    checkUnnamed815(o.items);
+    checkUnnamed180(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportDefinitionList--;
@@ -71,14 +71,14 @@
   buildCounterBatchReportDefinitionTemplateDefaultOutput--;
 }
 
-buildUnnamed816() {
+buildUnnamed181() {
   var o = new core.List<api.BatchReportDefinitionTemplateDefaultOutput>();
   o.add(buildBatchReportDefinitionTemplateDefaultOutput());
   o.add(buildBatchReportDefinitionTemplateDefaultOutput());
   return o;
 }
 
-checkUnnamed816(core.List<api.BatchReportDefinitionTemplateDefaultOutput> o) {
+checkUnnamed181(core.List<api.BatchReportDefinitionTemplateDefaultOutput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportDefinitionTemplateDefaultOutput(o[0]);
   checkBatchReportDefinitionTemplateDefaultOutput(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.BatchReportDefinitionTemplate();
   buildCounterBatchReportDefinitionTemplate++;
   if (buildCounterBatchReportDefinitionTemplate < 3) {
-    o.defaultOutput = buildUnnamed816();
+    o.defaultOutput = buildUnnamed181();
     o.id = "foo";
     o.name = "foo";
     o.status = "foo";
@@ -102,7 +102,7 @@
 checkBatchReportDefinitionTemplate(api.BatchReportDefinitionTemplate o) {
   buildCounterBatchReportDefinitionTemplate++;
   if (buildCounterBatchReportDefinitionTemplate < 3) {
-    checkUnnamed816(o.defaultOutput);
+    checkUnnamed181(o.defaultOutput);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -111,14 +111,14 @@
   buildCounterBatchReportDefinitionTemplate--;
 }
 
-buildUnnamed817() {
+buildUnnamed182() {
   var o = new core.List<api.BatchReportTemplate>();
   o.add(buildBatchReportTemplate());
   o.add(buildBatchReportTemplate());
   return o;
 }
 
-checkUnnamed817(core.List<api.BatchReportTemplate> o) {
+checkUnnamed182(core.List<api.BatchReportTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportTemplate(o[0]);
   checkBatchReportTemplate(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.BatchReportList();
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    o.items = buildUnnamed817();
+    o.items = buildUnnamed182();
     o.kind = "foo";
   }
   buildCounterBatchReportList--;
@@ -139,7 +139,7 @@
 checkBatchReportList(api.BatchReportList o) {
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    checkUnnamed817(o.items);
+    checkUnnamed182(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportList--;
@@ -168,14 +168,14 @@
   buildCounterBatchReportTemplateOutputs--;
 }
 
-buildUnnamed818() {
+buildUnnamed183() {
   var o = new core.List<api.BatchReportTemplateOutputs>();
   o.add(buildBatchReportTemplateOutputs());
   o.add(buildBatchReportTemplateOutputs());
   return o;
 }
 
-checkUnnamed818(core.List<api.BatchReportTemplateOutputs> o) {
+checkUnnamed183(core.List<api.BatchReportTemplateOutputs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportTemplateOutputs(o[0]);
   checkBatchReportTemplateOutputs(o[1]);
@@ -208,7 +208,7 @@
   buildCounterBatchReportTemplate++;
   if (buildCounterBatchReportTemplate < 3) {
     o.id = "foo";
-    o.outputs = buildUnnamed818();
+    o.outputs = buildUnnamed183();
     o.reportId = "foo";
     o.timeSpan = buildBatchReportTemplateTimeSpan();
     o.timeUpdated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -221,7 +221,7 @@
   buildCounterBatchReportTemplate++;
   if (buildCounterBatchReportTemplate < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed818(o.outputs);
+    checkUnnamed183(o.outputs);
     unittest.expect(o.reportId, unittest.equals('foo'));
     checkBatchReportTemplateTimeSpan(o.timeSpan);
     unittest.expect(o.timeUpdated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -252,43 +252,43 @@
   buildCounterResultTableColumnHeaders--;
 }
 
-buildUnnamed819() {
+buildUnnamed184() {
   var o = new core.List<api.ResultTableColumnHeaders>();
   o.add(buildResultTableColumnHeaders());
   o.add(buildResultTableColumnHeaders());
   return o;
 }
 
-checkUnnamed819(core.List<api.ResultTableColumnHeaders> o) {
+checkUnnamed184(core.List<api.ResultTableColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultTableColumnHeaders(o[0]);
   checkResultTableColumnHeaders(o[1]);
 }
 
-buildUnnamed820() {
+buildUnnamed185() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed820(core.List<core.Object> o) {
+checkUnnamed185(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) as core.Map; unittest.expect(casted1, unittest.hasLength(3)); unittest.expect(casted1["list"], unittest.equals([1, 2, 3])); unittest.expect(casted1["bool"], unittest.equals(true)); unittest.expect(casted1["string"], unittest.equals('foo')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed821() {
+buildUnnamed186() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed820());
-  o.add(buildUnnamed820());
+  o.add(buildUnnamed185());
+  o.add(buildUnnamed185());
   return o;
 }
 
-checkUnnamed821(core.List<core.List<core.Object>> o) {
+checkUnnamed186(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed820(o[0]);
-  checkUnnamed820(o[1]);
+  checkUnnamed185(o[0]);
+  checkUnnamed185(o[1]);
 }
 
 core.int buildCounterResultTable = 0;
@@ -296,9 +296,9 @@
   var o = new api.ResultTable();
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    o.columnHeaders = buildUnnamed819();
+    o.columnHeaders = buildUnnamed184();
     o.kind = "foo";
-    o.rows = buildUnnamed821();
+    o.rows = buildUnnamed186();
   }
   buildCounterResultTable--;
   return o;
@@ -307,9 +307,9 @@
 checkResultTable(api.ResultTable o) {
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    checkUnnamed819(o.columnHeaders);
+    checkUnnamed184(o.columnHeaders);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed821(o.rows);
+    checkUnnamed186(o.rows);
   }
   buildCounterResultTable--;
 }
diff --git a/generated/googleapis_beta/CHANGELOG.md b/generated/googleapis_beta/CHANGELOG.md
index 570cbbe..7e49e42 100644
--- a/generated/googleapis_beta/CHANGELOG.md
+++ b/generated/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.4.0
+
+* [apis] cloudmonitoring:v2beta1: additional schemas/methods
+* [apis-breaking] genomics:v1beta: additional schemas/methods, minor removal of schema properties
+
 ## 0.3.0
 
 * [apis-breaking] genomics:v1beta: breaking changes (method argument changes and schema change)
diff --git a/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart b/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart
index 5d4bcad..89b2425 100644
--- a/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart
+++ b/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart
@@ -804,7 +804,7 @@
    * applies. For gauge metrics, whose values are instantaneous measurements,
    * this interval should be empty (start should equal end). For cumulative
    * metrics (of which deltas and rates are special cases), the interval should
-   * be non-empty. Both start and end are RFC 3999 strings.
+   * be non-empty. Both start and end are RFC 3339 strings.
    */
   core.DateTime end;
 
@@ -816,7 +816,7 @@
    * applies. For gauge metrics, whose values are instantaneous measurements,
    * this interval should be empty (start should equal end). For cumulative
    * metrics (of which deltas and rates are special cases), the interval should
-   * be non-empty. Both start and end are RFC 3999 strings.
+   * be non-empty. Both start and end are RFC 3339 strings.
    */
   core.DateTime start;
 
@@ -1095,10 +1095,7 @@
 
 /** TimeseriesDescriptor identifies a single time series. */
 class TimeseriesDescriptor {
-  /**
-   * The set of key-value pairs that describe this time series, including
-   * target-specific labels and metric-specific labels.
-   */
+  /** The label's name. */
   core.Map<core.String, core.String> labels;
 
   /** The name of the metric. */
@@ -1140,3 +1137,36 @@
 }
 
 
+/** Not documented yet. */
+class TimeseriesDescriptorLabel {
+  /** The label's name. */
+  core.String key;
+
+  /** The label's value. */
+  core.String value;
+
+
+  TimeseriesDescriptorLabel();
+
+  TimeseriesDescriptorLabel.fromJson(core.Map _json) {
+    if (_json.containsKey("key")) {
+      key = _json["key"];
+    }
+    if (_json.containsKey("value")) {
+      value = _json["value"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (key != null) {
+      _json["key"] = key;
+    }
+    if (value != null) {
+      _json["value"] = value;
+    }
+    return _json;
+  }
+}
+
+
diff --git a/generated/googleapis_beta/lib/genomics/v1beta.dart b/generated/googleapis_beta/lib/genomics/v1beta.dart
index 788fa9d..ef44652 100644
--- a/generated/googleapis_beta/lib/genomics/v1beta.dart
+++ b/generated/googleapis_beta/lib/genomics/v1beta.dart
@@ -509,7 +509,8 @@
    * value of nextPageToken from the previous response.
    *
    * [projectId] - Only return datasets which belong to this Google Developers
-   * Console project. Only accepts project numbers.
+   * Console project. Only accepts project numbers. Returns all public projects
+   * if no project number is specified.
    *
    * Completes with a [ListDatasetsResponse].
    *
@@ -1784,6 +1785,53 @@
   }
 
   /**
+   * Updates a variant set's metadata. All other modifications are silently
+   * ignored. Returns the modified variant set. This method supports patch
+   * semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - The ID of the variant to be updated.
+   *
+   * Completes with a [VariantSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<VariantSet> patch(VariantSet request, core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new VariantSet.fromJson(data));
+  }
+
+  /**
    * Returns a list of all variant sets matching search criteria.
    *
    * [request] - The metadata request object.
@@ -1823,6 +1871,52 @@
     return _response.then((data) => new SearchVariantSetsResponse.fromJson(data));
   }
 
+  /**
+   * Updates a variant set's metadata. All other modifications are silently
+   * ignored. Returns the modified variant set.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - The ID of the variant to be updated.
+   *
+   * Completes with a [VariantSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<VariantSet> update(VariantSet request, core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new VariantSet.fromJson(data));
+  }
+
 }
 
 
@@ -2111,7 +2205,7 @@
 }
 
 
-/** The job creation request. Next ID: 12 */
+/** The job creation request. */
 class ExperimentalCreateJobRequest {
   /**
    * Specifies whether or not to run the alignment pipeline. At least one of
@@ -2133,9 +2227,6 @@
    */
   core.String gcsOutputPath;
 
-  /** For alignment from FASTQ files, this specifies the library name. */
-  core.String libraryName;
-
   /**
    * A list of Google Cloud Storage URIs of paired end .fastq files to operate
    * upon. If specified, this represents the second file of each paired .fastq
@@ -2143,23 +2234,11 @@
    */
   core.List<core.String> pairedSourceUris;
 
-  /** For alignment from FASTQ files, this specifies the platform name. */
-  core.String platformName;
-
-  /** For alignment from FASTQ files, this specifies the platform unit. */
-  core.String platformUnit;
-
   /**
    * Required. The Google Cloud Project ID with which to associate the request.
    */
   core.String projectId;
 
-  /** For alignment from FASTQ files, this specifies the read group ID. */
-  core.String readGroupId;
-
-  /** For alignment from FASTQ files, this specifies the sample name. */
-  core.String sampleName;
-
   /**
    * A list of Google Cloud Storage URIs of data files to operate upon. These
    * can be .bam, interleaved .fastq, or paired .fastq. If specifying paired
@@ -2181,27 +2260,12 @@
     if (_json.containsKey("gcsOutputPath")) {
       gcsOutputPath = _json["gcsOutputPath"];
     }
-    if (_json.containsKey("libraryName")) {
-      libraryName = _json["libraryName"];
-    }
     if (_json.containsKey("pairedSourceUris")) {
       pairedSourceUris = _json["pairedSourceUris"];
     }
-    if (_json.containsKey("platformName")) {
-      platformName = _json["platformName"];
-    }
-    if (_json.containsKey("platformUnit")) {
-      platformUnit = _json["platformUnit"];
-    }
     if (_json.containsKey("projectId")) {
       projectId = _json["projectId"];
     }
-    if (_json.containsKey("readGroupId")) {
-      readGroupId = _json["readGroupId"];
-    }
-    if (_json.containsKey("sampleName")) {
-      sampleName = _json["sampleName"];
-    }
     if (_json.containsKey("sourceUris")) {
       sourceUris = _json["sourceUris"];
     }
@@ -2218,27 +2282,12 @@
     if (gcsOutputPath != null) {
       _json["gcsOutputPath"] = gcsOutputPath;
     }
-    if (libraryName != null) {
-      _json["libraryName"] = libraryName;
-    }
     if (pairedSourceUris != null) {
       _json["pairedSourceUris"] = pairedSourceUris;
     }
-    if (platformName != null) {
-      _json["platformName"] = platformName;
-    }
-    if (platformUnit != null) {
-      _json["platformUnit"] = platformUnit;
-    }
     if (projectId != null) {
       _json["projectId"] = projectId;
     }
-    if (readGroupId != null) {
-      _json["readGroupId"] = readGroupId;
-    }
-    if (sampleName != null) {
-      _json["sampleName"] = sampleName;
-    }
     if (sourceUris != null) {
       _json["sourceUris"] = sourceUris;
     }
diff --git a/generated/googleapis_beta/lib/src/common_internal.dart b/generated/googleapis_beta/lib/src/common_internal.dart
index 2e522c8..180b38e 100644
--- a/generated/googleapis_beta/lib/src/common_internal.dart
+++ b/generated/googleapis_beta/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis_beta/0.3.0';
+    'google-api-dart-client googleapis_beta/0.4.0';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
diff --git a/generated/googleapis_beta/pubspec.yaml b/generated/googleapis_beta/pubspec.yaml
index a0fef33..311f4b2 100644
--- a/generated/googleapis_beta/pubspec.yaml
+++ b/generated/googleapis_beta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: googleapis_beta
-version: 0.3.0
+version: 0.4.0
 author: Dart Team <misc@dartlang.org>
 description: "Auto-generated client libraries for accessing the following APIs:autoscaler:v1beta2, cloudmonitoring:v2beta1, datastore:v1beta2, dns:v1beta1, genomics:v1beta, manager:v1beta2, pubsub:v1beta1, replicapool:v1beta1, resourceviews:v1beta1, resourceviews:v1beta2, sqladmin:v1beta3, taskqueue:v1beta2"
 homepage: http://www.dartlang.org/googleapis/
diff --git a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
index 5d3fccb..9dd1245 100644
--- a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
@@ -49,14 +49,14 @@
   buildCounterAutoscaler--;
 }
 
-buildUnnamed1227() {
+buildUnnamed1207() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed1227(core.List<api.Autoscaler> o) {
+checkUnnamed1207(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -67,7 +67,7 @@
   var o = new api.AutoscalerListResponse();
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    o.items = buildUnnamed1227();
+    o.items = buildUnnamed1207();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -78,21 +78,21 @@
 checkAutoscalerListResponse(api.AutoscalerListResponse o) {
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    checkUnnamed1227(o.items);
+    checkUnnamed1207(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAutoscalerListResponse--;
 }
 
-buildUnnamed1228() {
+buildUnnamed1208() {
   var o = new core.List<api.AutoscalingPolicyCustomMetricUtilization>();
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   return o;
 }
 
-checkUnnamed1228(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
+checkUnnamed1208(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalingPolicyCustomMetricUtilization(o[0]);
   checkAutoscalingPolicyCustomMetricUtilization(o[1]);
@@ -105,7 +105,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     o.coolDownPeriodSec = 42;
     o.cpuUtilization = buildAutoscalingPolicyCpuUtilization();
-    o.customMetricUtilizations = buildUnnamed1228();
+    o.customMetricUtilizations = buildUnnamed1208();
     o.loadBalancingUtilization = buildAutoscalingPolicyLoadBalancingUtilization();
     o.maxNumReplicas = 42;
     o.minNumReplicas = 42;
@@ -119,7 +119,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     unittest.expect(o.coolDownPeriodSec, unittest.equals(42));
     checkAutoscalingPolicyCpuUtilization(o.cpuUtilization);
-    checkUnnamed1228(o.customMetricUtilizations);
+    checkUnnamed1208(o.customMetricUtilizations);
     checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization);
     unittest.expect(o.maxNumReplicas, unittest.equals(42));
     unittest.expect(o.minNumReplicas, unittest.equals(42));
@@ -211,14 +211,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1229() {
+buildUnnamed1209() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1229(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1209(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -229,7 +229,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1229();
+    o.errors = buildUnnamed1209();
   }
   buildCounterOperationError--;
   return o;
@@ -238,7 +238,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1229(o.errors);
+    checkUnnamed1209(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -264,14 +264,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1230() {
+buildUnnamed1210() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1230(core.List<api.OperationWarningsData> o) {
+checkUnnamed1210(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -283,7 +283,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1230();
+    o.data = buildUnnamed1210();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -294,20 +294,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1230(o.data);
+    checkUnnamed1210(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1231() {
+buildUnnamed1211() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1231(core.List<api.OperationWarnings> o) {
+checkUnnamed1211(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -338,7 +338,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1231();
+    o.warnings = buildUnnamed1211();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -368,20 +368,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1231(o.warnings);
+    checkUnnamed1211(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1232() {
+buildUnnamed1212() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1232(core.List<api.Operation> o) {
+checkUnnamed1212(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -393,7 +393,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1232();
+    o.items = buildUnnamed1212();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -406,7 +406,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1232(o.items);
+    checkUnnamed1212(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
diff --git a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
index 0121612..67ba0ee 100644
--- a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
@@ -35,14 +35,14 @@
   buildCounterListMetricDescriptorsRequest--;
 }
 
-buildUnnamed1108() {
+buildUnnamed1270() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1108(core.List<api.MetricDescriptor> o) {
+checkUnnamed1270(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
@@ -54,7 +54,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     o.kind = "foo";
-    o.metrics = buildUnnamed1108();
+    o.metrics = buildUnnamed1270();
     o.nextPageToken = "foo";
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -65,7 +65,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1108(o.metrics);
+    checkUnnamed1270(o.metrics);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -90,14 +90,14 @@
   buildCounterListTimeseriesDescriptorsRequest--;
 }
 
-buildUnnamed1109() {
+buildUnnamed1271() {
   var o = new core.List<api.TimeseriesDescriptor>();
   o.add(buildTimeseriesDescriptor());
   o.add(buildTimeseriesDescriptor());
   return o;
 }
 
-checkUnnamed1109(core.List<api.TimeseriesDescriptor> o) {
+checkUnnamed1271(core.List<api.TimeseriesDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseriesDescriptor(o[0]);
   checkTimeseriesDescriptor(o[1]);
@@ -111,7 +111,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1109();
+    o.timeseries = buildUnnamed1271();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -124,7 +124,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1109(o.timeseries);
+    checkUnnamed1271(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -149,14 +149,14 @@
   buildCounterListTimeseriesRequest--;
 }
 
-buildUnnamed1110() {
+buildUnnamed1272() {
   var o = new core.List<api.Timeseries>();
   o.add(buildTimeseries());
   o.add(buildTimeseries());
   return o;
 }
 
-checkUnnamed1110(core.List<api.Timeseries> o) {
+checkUnnamed1272(core.List<api.Timeseries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseries(o[0]);
   checkTimeseries(o[1]);
@@ -170,7 +170,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1110();
+    o.timeseries = buildUnnamed1272();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesResponse--;
@@ -183,20 +183,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1110(o.timeseries);
+    checkUnnamed1272(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesResponse--;
 }
 
-buildUnnamed1111() {
+buildUnnamed1273() {
   var o = new core.List<api.MetricDescriptorLabelDescriptor>();
   o.add(buildMetricDescriptorLabelDescriptor());
   o.add(buildMetricDescriptorLabelDescriptor());
   return o;
 }
 
-checkUnnamed1111(core.List<api.MetricDescriptorLabelDescriptor> o) {
+checkUnnamed1273(core.List<api.MetricDescriptorLabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptorLabelDescriptor(o[0]);
   checkMetricDescriptorLabelDescriptor(o[1]);
@@ -208,7 +208,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
-    o.labels = buildUnnamed1111();
+    o.labels = buildUnnamed1273();
     o.name = "foo";
     o.project = "foo";
     o.typeDescriptor = buildMetricDescriptorTypeDescriptor();
@@ -221,7 +221,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1111(o.labels);
+    checkUnnamed1273(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     checkMetricDescriptorTypeDescriptor(o.typeDescriptor);
@@ -302,14 +302,14 @@
   buildCounterPoint--;
 }
 
-buildUnnamed1112() {
+buildUnnamed1274() {
   var o = new core.List<api.PointDistributionBucket>();
   o.add(buildPointDistributionBucket());
   o.add(buildPointDistributionBucket());
   return o;
 }
 
-checkUnnamed1112(core.List<api.PointDistributionBucket> o) {
+checkUnnamed1274(core.List<api.PointDistributionBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPointDistributionBucket(o[0]);
   checkPointDistributionBucket(o[1]);
@@ -320,7 +320,7 @@
   var o = new api.PointDistribution();
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    o.buckets = buildUnnamed1112();
+    o.buckets = buildUnnamed1274();
     o.overflowBucket = buildPointDistributionOverflowBucket();
     o.underflowBucket = buildPointDistributionUnderflowBucket();
   }
@@ -331,7 +331,7 @@
 checkPointDistribution(api.PointDistribution o) {
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    checkUnnamed1112(o.buckets);
+    checkUnnamed1274(o.buckets);
     checkPointDistributionOverflowBucket(o.overflowBucket);
     checkPointDistributionUnderflowBucket(o.underflowBucket);
   }
@@ -403,14 +403,14 @@
   buildCounterPointDistributionUnderflowBucket--;
 }
 
-buildUnnamed1113() {
+buildUnnamed1275() {
   var o = new core.List<api.Point>();
   o.add(buildPoint());
   o.add(buildPoint());
   return o;
 }
 
-checkUnnamed1113(core.List<api.Point> o) {
+checkUnnamed1275(core.List<api.Point> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPoint(o[0]);
   checkPoint(o[1]);
@@ -421,7 +421,7 @@
   var o = new api.Timeseries();
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    o.points = buildUnnamed1113();
+    o.points = buildUnnamed1275();
     o.timeseriesDesc = buildTimeseriesDescriptor();
   }
   buildCounterTimeseries--;
@@ -431,20 +431,20 @@
 checkTimeseries(api.Timeseries o) {
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    checkUnnamed1113(o.points);
+    checkUnnamed1275(o.points);
     checkTimeseriesDescriptor(o.timeseriesDesc);
   }
   buildCounterTimeseries--;
 }
 
-buildUnnamed1114() {
+buildUnnamed1276() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1114(core.Map<core.String, core.String> o) {
+checkUnnamed1276(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -455,7 +455,7 @@
   var o = new api.TimeseriesDescriptor();
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    o.labels = buildUnnamed1114();
+    o.labels = buildUnnamed1276();
     o.metric = "foo";
     o.project = "foo";
   }
@@ -466,34 +466,55 @@
 checkTimeseriesDescriptor(api.TimeseriesDescriptor o) {
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    checkUnnamed1114(o.labels);
+    checkUnnamed1276(o.labels);
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
   }
   buildCounterTimeseriesDescriptor--;
 }
 
-buildUnnamed1115() {
+core.int buildCounterTimeseriesDescriptorLabel = 0;
+buildTimeseriesDescriptorLabel() {
+  var o = new api.TimeseriesDescriptorLabel();
+  buildCounterTimeseriesDescriptorLabel++;
+  if (buildCounterTimeseriesDescriptorLabel < 3) {
+    o.key = "foo";
+    o.value = "foo";
+  }
+  buildCounterTimeseriesDescriptorLabel--;
+  return o;
+}
+
+checkTimeseriesDescriptorLabel(api.TimeseriesDescriptorLabel o) {
+  buildCounterTimeseriesDescriptorLabel++;
+  if (buildCounterTimeseriesDescriptorLabel < 3) {
+    unittest.expect(o.key, unittest.equals('foo'));
+    unittest.expect(o.value, unittest.equals('foo'));
+  }
+  buildCounterTimeseriesDescriptorLabel--;
+}
+
+buildUnnamed1277() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1115(core.List<core.String> o) {
+checkUnnamed1277(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1116() {
+buildUnnamed1278() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1116(core.List<core.String> o) {
+checkUnnamed1278(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -645,6 +666,15 @@
   });
 
 
+  unittest.group("obj-schema-TimeseriesDescriptorLabel", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildTimeseriesDescriptorLabel();
+      var od = new api.TimeseriesDescriptorLabel.fromJson(o.toJson());
+      checkTimeseriesDescriptorLabel(od);
+    });
+  });
+
+
   unittest.group("resource-MetricDescriptorsResourceApi", () {
     unittest.test("method--list", () {
 
@@ -711,7 +741,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1115();
+      var arg_labels = buildUnnamed1277();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
@@ -774,7 +804,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1116();
+      var arg_labels = buildUnnamed1278();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
diff --git a/generated/googleapis_beta/test/datastore/v1beta2_test.dart b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
index 9003303..78e80f8 100644
--- a/generated/googleapis_beta/test/datastore/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1203() {
+buildUnnamed1279() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1203(core.List<api.Key> o) {
+checkUnnamed1279(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.AllocateIdsRequest();
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    o.keys = buildUnnamed1203();
+    o.keys = buildUnnamed1279();
   }
   buildCounterAllocateIdsRequest--;
   return o;
@@ -43,19 +43,19 @@
 checkAllocateIdsRequest(api.AllocateIdsRequest o) {
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    checkUnnamed1203(o.keys);
+    checkUnnamed1279(o.keys);
   }
   buildCounterAllocateIdsRequest--;
 }
 
-buildUnnamed1204() {
+buildUnnamed1280() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1204(core.List<api.Key> o) {
+checkUnnamed1280(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -67,7 +67,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     o.header = buildResponseHeader();
-    o.keys = buildUnnamed1204();
+    o.keys = buildUnnamed1280();
   }
   buildCounterAllocateIdsResponse--;
   return o;
@@ -77,7 +77,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     checkResponseHeader(o.header);
-    checkUnnamed1204(o.keys);
+    checkUnnamed1280(o.keys);
   }
   buildCounterAllocateIdsResponse--;
 }
@@ -168,14 +168,14 @@
   buildCounterCommitResponse--;
 }
 
-buildUnnamed1205() {
+buildUnnamed1281() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed1205(core.List<api.Filter> o) {
+checkUnnamed1281(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -186,7 +186,7 @@
   var o = new api.CompositeFilter();
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    o.filters = buildUnnamed1205();
+    o.filters = buildUnnamed1281();
     o.operator = "foo";
   }
   buildCounterCompositeFilter--;
@@ -196,20 +196,20 @@
 checkCompositeFilter(api.CompositeFilter o) {
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    checkUnnamed1205(o.filters);
+    checkUnnamed1281(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterCompositeFilter--;
 }
 
-buildUnnamed1206() {
+buildUnnamed1282() {
   var o = new core.Map<core.String, api.Property>();
   o["x"] = buildProperty();
   o["y"] = buildProperty();
   return o;
 }
 
-checkUnnamed1206(core.Map<core.String, api.Property> o) {
+checkUnnamed1282(core.Map<core.String, api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o["x"]);
   checkProperty(o["y"]);
@@ -221,7 +221,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     o.key = buildKey();
-    o.properties = buildUnnamed1206();
+    o.properties = buildUnnamed1282();
   }
   buildCounterEntity--;
   return o;
@@ -231,7 +231,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     checkKey(o.key);
-    checkUnnamed1206(o.properties);
+    checkUnnamed1282(o.properties);
   }
   buildCounterEntity--;
 }
@@ -276,27 +276,27 @@
   buildCounterFilter--;
 }
 
-buildUnnamed1207() {
+buildUnnamed1283() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1207(core.List<api.GqlQueryArg> o) {
+checkUnnamed1283(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
 }
 
-buildUnnamed1208() {
+buildUnnamed1284() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1208(core.List<api.GqlQueryArg> o) {
+checkUnnamed1284(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
@@ -308,8 +308,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     o.allowLiteral = true;
-    o.nameArgs = buildUnnamed1207();
-    o.numberArgs = buildUnnamed1208();
+    o.nameArgs = buildUnnamed1283();
+    o.numberArgs = buildUnnamed1284();
     o.queryString = "foo";
   }
   buildCounterGqlQuery--;
@@ -320,8 +320,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     unittest.expect(o.allowLiteral, unittest.isTrue);
-    checkUnnamed1207(o.nameArgs);
-    checkUnnamed1208(o.numberArgs);
+    checkUnnamed1283(o.nameArgs);
+    checkUnnamed1284(o.numberArgs);
     unittest.expect(o.queryString, unittest.equals('foo'));
   }
   buildCounterGqlQuery--;
@@ -350,14 +350,14 @@
   buildCounterGqlQueryArg--;
 }
 
-buildUnnamed1209() {
+buildUnnamed1285() {
   var o = new core.List<api.KeyPathElement>();
   o.add(buildKeyPathElement());
   o.add(buildKeyPathElement());
   return o;
 }
 
-checkUnnamed1209(core.List<api.KeyPathElement> o) {
+checkUnnamed1285(core.List<api.KeyPathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyPathElement(o[0]);
   checkKeyPathElement(o[1]);
@@ -369,7 +369,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     o.partitionId = buildPartitionId();
-    o.path = buildUnnamed1209();
+    o.path = buildUnnamed1285();
   }
   buildCounterKey--;
   return o;
@@ -379,7 +379,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     checkPartitionId(o.partitionId);
-    checkUnnamed1209(o.path);
+    checkUnnamed1285(o.path);
   }
   buildCounterKey--;
 }
@@ -426,14 +426,14 @@
   buildCounterKindExpression--;
 }
 
-buildUnnamed1210() {
+buildUnnamed1286() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1210(core.List<api.Key> o) {
+checkUnnamed1286(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -444,7 +444,7 @@
   var o = new api.LookupRequest();
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    o.keys = buildUnnamed1210();
+    o.keys = buildUnnamed1286();
     o.readOptions = buildReadOptions();
   }
   buildCounterLookupRequest--;
@@ -454,46 +454,46 @@
 checkLookupRequest(api.LookupRequest o) {
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    checkUnnamed1210(o.keys);
+    checkUnnamed1286(o.keys);
     checkReadOptions(o.readOptions);
   }
   buildCounterLookupRequest--;
 }
 
-buildUnnamed1211() {
+buildUnnamed1287() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1211(core.List<api.Key> o) {
+checkUnnamed1287(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1212() {
+buildUnnamed1288() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1212(core.List<api.EntityResult> o) {
+checkUnnamed1288(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
 }
 
-buildUnnamed1213() {
+buildUnnamed1289() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1213(core.List<api.EntityResult> o) {
+checkUnnamed1289(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -504,10 +504,10 @@
   var o = new api.LookupResponse();
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    o.deferred = buildUnnamed1211();
-    o.found = buildUnnamed1212();
+    o.deferred = buildUnnamed1287();
+    o.found = buildUnnamed1288();
     o.header = buildResponseHeader();
-    o.missing = buildUnnamed1213();
+    o.missing = buildUnnamed1289();
   }
   buildCounterLookupResponse--;
   return o;
@@ -516,74 +516,74 @@
 checkLookupResponse(api.LookupResponse o) {
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    checkUnnamed1211(o.deferred);
-    checkUnnamed1212(o.found);
+    checkUnnamed1287(o.deferred);
+    checkUnnamed1288(o.found);
     checkResponseHeader(o.header);
-    checkUnnamed1213(o.missing);
+    checkUnnamed1289(o.missing);
   }
   buildCounterLookupResponse--;
 }
 
-buildUnnamed1214() {
+buildUnnamed1290() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1214(core.List<api.Key> o) {
+checkUnnamed1290(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1215() {
+buildUnnamed1291() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1215(core.List<api.Entity> o) {
+checkUnnamed1291(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1216() {
+buildUnnamed1292() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1216(core.List<api.Entity> o) {
+checkUnnamed1292(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1217() {
+buildUnnamed1293() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1217(core.List<api.Entity> o) {
+checkUnnamed1293(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1218() {
+buildUnnamed1294() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1218(core.List<api.Entity> o) {
+checkUnnamed1294(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -594,12 +594,12 @@
   var o = new api.Mutation();
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    o.delete = buildUnnamed1214();
+    o.delete = buildUnnamed1290();
     o.force = true;
-    o.insert = buildUnnamed1215();
-    o.insertAutoId = buildUnnamed1216();
-    o.update = buildUnnamed1217();
-    o.upsert = buildUnnamed1218();
+    o.insert = buildUnnamed1291();
+    o.insertAutoId = buildUnnamed1292();
+    o.update = buildUnnamed1293();
+    o.upsert = buildUnnamed1294();
   }
   buildCounterMutation--;
   return o;
@@ -608,24 +608,24 @@
 checkMutation(api.Mutation o) {
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    checkUnnamed1214(o.delete);
+    checkUnnamed1290(o.delete);
     unittest.expect(o.force, unittest.isTrue);
-    checkUnnamed1215(o.insert);
-    checkUnnamed1216(o.insertAutoId);
-    checkUnnamed1217(o.update);
-    checkUnnamed1218(o.upsert);
+    checkUnnamed1291(o.insert);
+    checkUnnamed1292(o.insertAutoId);
+    checkUnnamed1293(o.update);
+    checkUnnamed1294(o.upsert);
   }
   buildCounterMutation--;
 }
 
-buildUnnamed1219() {
+buildUnnamed1295() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1219(core.List<api.Key> o) {
+checkUnnamed1295(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -637,7 +637,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     o.indexUpdates = 42;
-    o.insertAutoIdKeys = buildUnnamed1219();
+    o.insertAutoIdKeys = buildUnnamed1295();
   }
   buildCounterMutationResult--;
   return o;
@@ -647,7 +647,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     unittest.expect(o.indexUpdates, unittest.equals(42));
-    checkUnnamed1219(o.insertAutoIdKeys);
+    checkUnnamed1295(o.insertAutoIdKeys);
   }
   buildCounterMutationResult--;
 }
@@ -673,14 +673,14 @@
   buildCounterPartitionId--;
 }
 
-buildUnnamed1220() {
+buildUnnamed1296() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1220(core.List<api.Value> o) {
+checkUnnamed1296(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -700,7 +700,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1220();
+    o.listValue = buildUnnamed1296();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -720,7 +720,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1220(o.listValue);
+    checkUnnamed1296(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
@@ -811,53 +811,53 @@
   buildCounterPropertyReference--;
 }
 
-buildUnnamed1221() {
+buildUnnamed1297() {
   var o = new core.List<api.PropertyReference>();
   o.add(buildPropertyReference());
   o.add(buildPropertyReference());
   return o;
 }
 
-checkUnnamed1221(core.List<api.PropertyReference> o) {
+checkUnnamed1297(core.List<api.PropertyReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyReference(o[0]);
   checkPropertyReference(o[1]);
 }
 
-buildUnnamed1222() {
+buildUnnamed1298() {
   var o = new core.List<api.KindExpression>();
   o.add(buildKindExpression());
   o.add(buildKindExpression());
   return o;
 }
 
-checkUnnamed1222(core.List<api.KindExpression> o) {
+checkUnnamed1298(core.List<api.KindExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKindExpression(o[0]);
   checkKindExpression(o[1]);
 }
 
-buildUnnamed1223() {
+buildUnnamed1299() {
   var o = new core.List<api.PropertyOrder>();
   o.add(buildPropertyOrder());
   o.add(buildPropertyOrder());
   return o;
 }
 
-checkUnnamed1223(core.List<api.PropertyOrder> o) {
+checkUnnamed1299(core.List<api.PropertyOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyOrder(o[0]);
   checkPropertyOrder(o[1]);
 }
 
-buildUnnamed1224() {
+buildUnnamed1300() {
   var o = new core.List<api.PropertyExpression>();
   o.add(buildPropertyExpression());
   o.add(buildPropertyExpression());
   return o;
 }
 
-checkUnnamed1224(core.List<api.PropertyExpression> o) {
+checkUnnamed1300(core.List<api.PropertyExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyExpression(o[0]);
   checkPropertyExpression(o[1]);
@@ -870,12 +870,12 @@
   if (buildCounterQuery < 3) {
     o.endCursor = "foo";
     o.filter = buildFilter();
-    o.groupBy = buildUnnamed1221();
-    o.kinds = buildUnnamed1222();
+    o.groupBy = buildUnnamed1297();
+    o.kinds = buildUnnamed1298();
     o.limit = 42;
     o.offset = 42;
-    o.order = buildUnnamed1223();
-    o.projection = buildUnnamed1224();
+    o.order = buildUnnamed1299();
+    o.projection = buildUnnamed1300();
     o.startCursor = "foo";
   }
   buildCounterQuery--;
@@ -887,25 +887,25 @@
   if (buildCounterQuery < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     checkFilter(o.filter);
-    checkUnnamed1221(o.groupBy);
-    checkUnnamed1222(o.kinds);
+    checkUnnamed1297(o.groupBy);
+    checkUnnamed1298(o.kinds);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
-    checkUnnamed1223(o.order);
-    checkUnnamed1224(o.projection);
+    checkUnnamed1299(o.order);
+    checkUnnamed1300(o.projection);
     unittest.expect(o.startCursor, unittest.equals('foo'));
   }
   buildCounterQuery--;
 }
 
-buildUnnamed1225() {
+buildUnnamed1301() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1225(core.List<api.EntityResult> o) {
+checkUnnamed1301(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -918,7 +918,7 @@
   if (buildCounterQueryResultBatch < 3) {
     o.endCursor = "foo";
     o.entityResultType = "foo";
-    o.entityResults = buildUnnamed1225();
+    o.entityResults = buildUnnamed1301();
     o.moreResults = "foo";
     o.skippedResults = 42;
   }
@@ -931,7 +931,7 @@
   if (buildCounterQueryResultBatch < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     unittest.expect(o.entityResultType, unittest.equals('foo'));
-    checkUnnamed1225(o.entityResults);
+    checkUnnamed1301(o.entityResults);
     unittest.expect(o.moreResults, unittest.equals('foo'));
     unittest.expect(o.skippedResults, unittest.equals(42));
   }
@@ -1062,14 +1062,14 @@
   buildCounterRunQueryResponse--;
 }
 
-buildUnnamed1226() {
+buildUnnamed1302() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1226(core.List<api.Value> o) {
+checkUnnamed1302(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -1089,7 +1089,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1226();
+    o.listValue = buildUnnamed1302();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -1109,7 +1109,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1226(o.listValue);
+    checkUnnamed1302(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
diff --git a/generated/googleapis_beta/test/dns/v1beta1_test.dart b/generated/googleapis_beta/test/dns/v1beta1_test.dart
index 7af675c..984767e 100644
--- a/generated/googleapis_beta/test/dns/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/dns/v1beta1_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed1280() {
+buildUnnamed1128() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1280(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1128(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
 }
 
-buildUnnamed1281() {
+buildUnnamed1129() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1281(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1129(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -47,8 +47,8 @@
   var o = new api.Change();
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    o.additions = buildUnnamed1280();
-    o.deletions = buildUnnamed1281();
+    o.additions = buildUnnamed1128();
+    o.deletions = buildUnnamed1129();
     o.id = "foo";
     o.kind = "foo";
     o.startTime = "foo";
@@ -61,8 +61,8 @@
 checkChange(api.Change o) {
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    checkUnnamed1280(o.additions);
-    checkUnnamed1281(o.deletions);
+    checkUnnamed1128(o.additions);
+    checkUnnamed1129(o.deletions);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -71,14 +71,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed1282() {
+buildUnnamed1130() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed1282(core.List<api.Change> o) {
+checkUnnamed1130(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.ChangesListResponse();
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    o.changes = buildUnnamed1282();
+    o.changes = buildUnnamed1130();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -100,21 +100,21 @@
 checkChangesListResponse(api.ChangesListResponse o) {
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    checkUnnamed1282(o.changes);
+    checkUnnamed1130(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangesListResponse--;
 }
 
-buildUnnamed1283() {
+buildUnnamed1131() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1283(core.List<core.String> o) {
+checkUnnamed1131(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -131,7 +131,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nameServers = buildUnnamed1283();
+    o.nameServers = buildUnnamed1131();
   }
   buildCounterManagedZone--;
   return o;
@@ -146,19 +146,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1283(o.nameServers);
+    checkUnnamed1131(o.nameServers);
   }
   buildCounterManagedZone--;
 }
 
-buildUnnamed1284() {
+buildUnnamed1132() {
   var o = new core.List<api.ManagedZone>();
   o.add(buildManagedZone());
   o.add(buildManagedZone());
   return o;
 }
 
-checkUnnamed1284(core.List<api.ManagedZone> o) {
+checkUnnamed1132(core.List<api.ManagedZone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedZone(o[0]);
   checkManagedZone(o[1]);
@@ -170,7 +170,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     o.kind = "foo";
-    o.managedZones = buildUnnamed1284();
+    o.managedZones = buildUnnamed1132();
     o.nextPageToken = "foo";
   }
   buildCounterManagedZonesListResponse--;
@@ -181,7 +181,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1284(o.managedZones);
+    checkUnnamed1132(o.managedZones);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManagedZonesListResponse--;
@@ -243,14 +243,14 @@
   buildCounterQuota--;
 }
 
-buildUnnamed1285() {
+buildUnnamed1133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1285(core.List<core.String> o) {
+checkUnnamed1133(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -263,7 +263,7 @@
   if (buildCounterResourceRecordSet < 3) {
     o.kind = "foo";
     o.name = "foo";
-    o.rrdatas = buildUnnamed1285();
+    o.rrdatas = buildUnnamed1133();
     o.ttl = 42;
     o.type = "foo";
   }
@@ -276,21 +276,21 @@
   if (buildCounterResourceRecordSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1285(o.rrdatas);
+    checkUnnamed1133(o.rrdatas);
     unittest.expect(o.ttl, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterResourceRecordSet--;
 }
 
-buildUnnamed1286() {
+buildUnnamed1134() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1286(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1134(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -303,7 +303,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.rrsets = buildUnnamed1286();
+    o.rrsets = buildUnnamed1134();
   }
   buildCounterResourceRecordSetsListResponse--;
   return o;
@@ -314,7 +314,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1286(o.rrsets);
+    checkUnnamed1134(o.rrsets);
   }
   buildCounterResourceRecordSetsListResponse--;
 }
diff --git a/generated/googleapis_beta/test/genomics/v1beta_test.dart b/generated/googleapis_beta/test/genomics/v1beta_test.dart
index 67dbabf..18e857e 100644
--- a/generated/googleapis_beta/test/genomics/v1beta_test.dart
+++ b/generated/googleapis_beta/test/genomics/v1beta_test.dart
@@ -35,56 +35,56 @@
   buildCounterBeacon--;
 }
 
-buildUnnamed1150() {
+buildUnnamed1213() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1150(core.List<core.int> o) {
+checkUnnamed1213(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1151() {
+buildUnnamed1214() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1151(core.List<core.double> o) {
+checkUnnamed1214(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed1152() {
+buildUnnamed1215() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1152(core.List<core.String> o) {
+checkUnnamed1215(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1153() {
+buildUnnamed1216() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1152();
-  o["y"] = buildUnnamed1152();
+  o["x"] = buildUnnamed1215();
+  o["y"] = buildUnnamed1215();
   return o;
 }
 
-checkUnnamed1153(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1216(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1152(o["x"]);
-  checkUnnamed1152(o["y"]);
+  checkUnnamed1215(o["x"]);
+  checkUnnamed1215(o["y"]);
 }
 
 core.int buildCounterCall = 0;
@@ -94,9 +94,9 @@
   if (buildCounterCall < 3) {
     o.callSetId = "foo";
     o.callSetName = "foo";
-    o.genotype = buildUnnamed1150();
-    o.genotypeLikelihood = buildUnnamed1151();
-    o.info = buildUnnamed1153();
+    o.genotype = buildUnnamed1213();
+    o.genotypeLikelihood = buildUnnamed1214();
+    o.info = buildUnnamed1216();
     o.phaseset = "foo";
   }
   buildCounterCall--;
@@ -108,48 +108,48 @@
   if (buildCounterCall < 3) {
     unittest.expect(o.callSetId, unittest.equals('foo'));
     unittest.expect(o.callSetName, unittest.equals('foo'));
-    checkUnnamed1150(o.genotype);
-    checkUnnamed1151(o.genotypeLikelihood);
-    checkUnnamed1153(o.info);
+    checkUnnamed1213(o.genotype);
+    checkUnnamed1214(o.genotypeLikelihood);
+    checkUnnamed1216(o.info);
     unittest.expect(o.phaseset, unittest.equals('foo'));
   }
   buildCounterCall--;
 }
 
-buildUnnamed1154() {
+buildUnnamed1217() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1154(core.List<core.String> o) {
+checkUnnamed1217(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1155() {
+buildUnnamed1218() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1154();
-  o["y"] = buildUnnamed1154();
+  o["x"] = buildUnnamed1217();
+  o["y"] = buildUnnamed1217();
   return o;
 }
 
-checkUnnamed1155(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1218(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1154(o["x"]);
-  checkUnnamed1154(o["y"]);
+  checkUnnamed1217(o["x"]);
+  checkUnnamed1217(o["y"]);
 }
 
-buildUnnamed1156() {
+buildUnnamed1219() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1156(core.List<core.String> o) {
+checkUnnamed1219(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -162,10 +162,10 @@
   if (buildCounterCallSet < 3) {
     o.created = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1155();
+    o.info = buildUnnamed1218();
     o.name = "foo";
     o.sampleId = "foo";
-    o.variantSetIds = buildUnnamed1156();
+    o.variantSetIds = buildUnnamed1219();
   }
   buildCounterCallSet--;
   return o;
@@ -176,10 +176,10 @@
   if (buildCounterCallSet < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1155(o.info);
+    checkUnnamed1218(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sampleId, unittest.equals('foo'));
-    checkUnnamed1156(o.variantSetIds);
+    checkUnnamed1219(o.variantSetIds);
   }
   buildCounterCallSet--;
 }
@@ -230,27 +230,27 @@
   buildCounterDataset--;
 }
 
-buildUnnamed1157() {
+buildUnnamed1220() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1157(core.List<core.String> o) {
+checkUnnamed1220(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1158() {
+buildUnnamed1221() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1158(core.List<core.String> o) {
+checkUnnamed1221(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -264,14 +264,9 @@
     o.align = true;
     o.callVariants = true;
     o.gcsOutputPath = "foo";
-    o.libraryName = "foo";
-    o.pairedSourceUris = buildUnnamed1157();
-    o.platformName = "foo";
-    o.platformUnit = "foo";
+    o.pairedSourceUris = buildUnnamed1220();
     o.projectId = "foo";
-    o.readGroupId = "foo";
-    o.sampleName = "foo";
-    o.sourceUris = buildUnnamed1158();
+    o.sourceUris = buildUnnamed1221();
   }
   buildCounterExperimentalCreateJobRequest--;
   return o;
@@ -283,14 +278,9 @@
     unittest.expect(o.align, unittest.isTrue);
     unittest.expect(o.callVariants, unittest.isTrue);
     unittest.expect(o.gcsOutputPath, unittest.equals('foo'));
-    unittest.expect(o.libraryName, unittest.equals('foo'));
-    checkUnnamed1157(o.pairedSourceUris);
-    unittest.expect(o.platformName, unittest.equals('foo'));
-    unittest.expect(o.platformUnit, unittest.equals('foo'));
+    checkUnnamed1220(o.pairedSourceUris);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    unittest.expect(o.readGroupId, unittest.equals('foo'));
-    unittest.expect(o.sampleName, unittest.equals('foo'));
-    checkUnnamed1158(o.sourceUris);
+    checkUnnamed1221(o.sourceUris);
   }
   buildCounterExperimentalCreateJobRequest--;
 }
@@ -314,27 +304,27 @@
   buildCounterExperimentalCreateJobResponse--;
 }
 
-buildUnnamed1159() {
+buildUnnamed1222() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1159(core.List<core.String> o) {
+checkUnnamed1222(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1160() {
+buildUnnamed1223() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1160(core.List<core.String> o) {
+checkUnnamed1223(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -347,8 +337,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     o.exportUri = "foo";
     o.projectId = "foo";
-    o.readsetIds = buildUnnamed1159();
-    o.referenceNames = buildUnnamed1160();
+    o.readsetIds = buildUnnamed1222();
+    o.referenceNames = buildUnnamed1223();
   }
   buildCounterExportReadsetsRequest--;
   return o;
@@ -359,8 +349,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     unittest.expect(o.exportUri, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1159(o.readsetIds);
-    checkUnnamed1160(o.referenceNames);
+    checkUnnamed1222(o.readsetIds);
+    checkUnnamed1223(o.referenceNames);
   }
   buildCounterExportReadsetsRequest--;
 }
@@ -384,14 +374,14 @@
   buildCounterExportReadsetsResponse--;
 }
 
-buildUnnamed1161() {
+buildUnnamed1224() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1161(core.List<core.String> o) {
+checkUnnamed1224(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -404,7 +394,7 @@
   if (buildCounterExportVariantsRequest < 3) {
     o.bigqueryDataset = "foo";
     o.bigqueryTable = "foo";
-    o.callSetIds = buildUnnamed1161();
+    o.callSetIds = buildUnnamed1224();
     o.format = "foo";
     o.projectId = "foo";
     o.variantSetId = "foo";
@@ -418,7 +408,7 @@
   if (buildCounterExportVariantsRequest < 3) {
     unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
     unittest.expect(o.bigqueryTable, unittest.equals('foo'));
-    checkUnnamed1161(o.callSetIds);
+    checkUnnamed1224(o.callSetIds);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.variantSetId, unittest.equals('foo'));
@@ -489,66 +479,66 @@
   buildCounterHeader--;
 }
 
-buildUnnamed1162() {
+buildUnnamed1225() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1162(core.List<core.String> o) {
+checkUnnamed1225(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1163() {
+buildUnnamed1226() {
   var o = new core.List<api.Header>();
   o.add(buildHeader());
   o.add(buildHeader());
   return o;
 }
 
-checkUnnamed1163(core.List<api.Header> o) {
+checkUnnamed1226(core.List<api.Header> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeader(o[0]);
   checkHeader(o[1]);
 }
 
-buildUnnamed1164() {
+buildUnnamed1227() {
   var o = new core.List<api.Program>();
   o.add(buildProgram());
   o.add(buildProgram());
   return o;
 }
 
-checkUnnamed1164(core.List<api.Program> o) {
+checkUnnamed1227(core.List<api.Program> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProgram(o[0]);
   checkProgram(o[1]);
 }
 
-buildUnnamed1165() {
+buildUnnamed1228() {
   var o = new core.List<api.ReadGroup>();
   o.add(buildReadGroup());
   o.add(buildReadGroup());
   return o;
 }
 
-checkUnnamed1165(core.List<api.ReadGroup> o) {
+checkUnnamed1228(core.List<api.ReadGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroup(o[0]);
   checkReadGroup(o[1]);
 }
 
-buildUnnamed1166() {
+buildUnnamed1229() {
   var o = new core.List<api.ReferenceSequence>();
   o.add(buildReferenceSequence());
   o.add(buildReferenceSequence());
   return o;
 }
 
-checkUnnamed1166(core.List<api.ReferenceSequence> o) {
+checkUnnamed1229(core.List<api.ReferenceSequence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceSequence(o[0]);
   checkReferenceSequence(o[1]);
@@ -559,13 +549,13 @@
   var o = new api.HeaderSection();
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    o.comments = buildUnnamed1162();
+    o.comments = buildUnnamed1225();
     o.fileUri = "foo";
     o.filename = "foo";
-    o.headers = buildUnnamed1163();
-    o.programs = buildUnnamed1164();
-    o.readGroups = buildUnnamed1165();
-    o.refSequences = buildUnnamed1166();
+    o.headers = buildUnnamed1226();
+    o.programs = buildUnnamed1227();
+    o.readGroups = buildUnnamed1228();
+    o.refSequences = buildUnnamed1229();
   }
   buildCounterHeaderSection--;
   return o;
@@ -574,25 +564,25 @@
 checkHeaderSection(api.HeaderSection o) {
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    checkUnnamed1162(o.comments);
+    checkUnnamed1225(o.comments);
     unittest.expect(o.fileUri, unittest.equals('foo'));
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed1163(o.headers);
-    checkUnnamed1164(o.programs);
-    checkUnnamed1165(o.readGroups);
-    checkUnnamed1166(o.refSequences);
+    checkUnnamed1226(o.headers);
+    checkUnnamed1227(o.programs);
+    checkUnnamed1228(o.readGroups);
+    checkUnnamed1229(o.refSequences);
   }
   buildCounterHeaderSection--;
 }
 
-buildUnnamed1167() {
+buildUnnamed1230() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1167(core.List<core.String> o) {
+checkUnnamed1230(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -604,7 +594,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     o.datasetId = "foo";
-    o.sourceUris = buildUnnamed1167();
+    o.sourceUris = buildUnnamed1230();
   }
   buildCounterImportReadsetsRequest--;
   return o;
@@ -614,7 +604,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1167(o.sourceUris);
+    checkUnnamed1230(o.sourceUris);
   }
   buildCounterImportReadsetsRequest--;
 }
@@ -638,14 +628,14 @@
   buildCounterImportReadsetsResponse--;
 }
 
-buildUnnamed1168() {
+buildUnnamed1231() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1168(core.List<core.String> o) {
+checkUnnamed1231(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -657,7 +647,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     o.format = "foo";
-    o.sourceUris = buildUnnamed1168();
+    o.sourceUris = buildUnnamed1231();
     o.variantSetId = "foo";
   }
   buildCounterImportVariantsRequest--;
@@ -668,7 +658,7 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed1168(o.sourceUris);
+    checkUnnamed1231(o.sourceUris);
     unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterImportVariantsRequest--;
@@ -693,40 +683,40 @@
   buildCounterImportVariantsResponse--;
 }
 
-buildUnnamed1169() {
+buildUnnamed1232() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1169(core.List<core.String> o) {
+checkUnnamed1232(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1170() {
+buildUnnamed1233() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1170(core.List<core.String> o) {
+checkUnnamed1233(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1171() {
+buildUnnamed1234() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1171(core.List<core.String> o) {
+checkUnnamed1234(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -739,13 +729,13 @@
   if (buildCounterJob < 3) {
     o.created = "foo";
     o.description = "foo";
-    o.errors = buildUnnamed1169();
+    o.errors = buildUnnamed1232();
     o.id = "foo";
-    o.importedIds = buildUnnamed1170();
+    o.importedIds = buildUnnamed1233();
     o.projectId = "foo";
     o.request = buildJobRequest();
     o.status = "foo";
-    o.warnings = buildUnnamed1171();
+    o.warnings = buildUnnamed1234();
   }
   buildCounterJob--;
   return o;
@@ -756,38 +746,38 @@
   if (buildCounterJob < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1169(o.errors);
+    checkUnnamed1232(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1170(o.importedIds);
+    checkUnnamed1233(o.importedIds);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkJobRequest(o.request);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed1171(o.warnings);
+    checkUnnamed1234(o.warnings);
   }
   buildCounterJob--;
 }
 
-buildUnnamed1172() {
+buildUnnamed1235() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1172(core.List<core.String> o) {
+checkUnnamed1235(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1173() {
+buildUnnamed1236() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1173(core.List<core.String> o) {
+checkUnnamed1236(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -798,8 +788,8 @@
   var o = new api.JobRequest();
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    o.destination = buildUnnamed1172();
-    o.source = buildUnnamed1173();
+    o.destination = buildUnnamed1235();
+    o.source = buildUnnamed1236();
     o.type = "foo";
   }
   buildCounterJobRequest--;
@@ -809,21 +799,21 @@
 checkJobRequest(api.JobRequest o) {
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    checkUnnamed1172(o.destination);
-    checkUnnamed1173(o.source);
+    checkUnnamed1235(o.destination);
+    checkUnnamed1236(o.source);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterJobRequest--;
 }
 
-buildUnnamed1174() {
+buildUnnamed1237() {
   var o = new core.List<api.CoverageBucket>();
   o.add(buildCoverageBucket());
   o.add(buildCoverageBucket());
   return o;
 }
 
-checkUnnamed1174(core.List<api.CoverageBucket> o) {
+checkUnnamed1237(core.List<api.CoverageBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverageBucket(o[0]);
   checkCoverageBucket(o[1]);
@@ -835,7 +825,7 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     o.bucketWidth = "foo";
-    o.coverageBuckets = buildUnnamed1174();
+    o.coverageBuckets = buildUnnamed1237();
     o.nextPageToken = "foo";
   }
   buildCounterListCoverageBucketsResponse--;
@@ -846,20 +836,20 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     unittest.expect(o.bucketWidth, unittest.equals('foo'));
-    checkUnnamed1174(o.coverageBuckets);
+    checkUnnamed1237(o.coverageBuckets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoverageBucketsResponse--;
 }
 
-buildUnnamed1175() {
+buildUnnamed1238() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed1175(core.List<api.Dataset> o) {
+checkUnnamed1238(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -870,7 +860,7 @@
   var o = new api.ListDatasetsResponse();
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    o.datasets = buildUnnamed1175();
+    o.datasets = buildUnnamed1238();
     o.nextPageToken = "foo";
   }
   buildCounterListDatasetsResponse--;
@@ -880,20 +870,20 @@
 checkListDatasetsResponse(api.ListDatasetsResponse o) {
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    checkUnnamed1175(o.datasets);
+    checkUnnamed1238(o.datasets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatasetsResponse--;
 }
 
-buildUnnamed1176() {
+buildUnnamed1239() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1176(core.List<api.Variant> o) {
+checkUnnamed1239(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -904,7 +894,7 @@
   var o = new api.MergeVariantsRequest();
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    o.variants = buildUnnamed1176();
+    o.variants = buildUnnamed1239();
   }
   buildCounterMergeVariantsRequest--;
   return o;
@@ -913,35 +903,35 @@
 checkMergeVariantsRequest(api.MergeVariantsRequest o) {
   buildCounterMergeVariantsRequest++;
   if (buildCounterMergeVariantsRequest < 3) {
-    checkUnnamed1176(o.variants);
+    checkUnnamed1239(o.variants);
   }
   buildCounterMergeVariantsRequest--;
 }
 
-buildUnnamed1177() {
+buildUnnamed1240() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1177(core.List<core.String> o) {
+checkUnnamed1240(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1178() {
+buildUnnamed1241() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1177();
-  o["y"] = buildUnnamed1177();
+  o["x"] = buildUnnamed1240();
+  o["y"] = buildUnnamed1240();
   return o;
 }
 
-checkUnnamed1178(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1241(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1177(o["x"]);
-  checkUnnamed1177(o["y"]);
+  checkUnnamed1240(o["x"]);
+  checkUnnamed1240(o["y"]);
 }
 
 core.int buildCounterMetadata = 0;
@@ -951,7 +941,7 @@
   if (buildCounterMetadata < 3) {
     o.description = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1178();
+    o.info = buildUnnamed1241();
     o.key = "foo";
     o.number = "foo";
     o.type = "foo";
@@ -966,7 +956,7 @@
   if (buildCounterMetadata < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1178(o.info);
+    checkUnnamed1241(o.info);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1002,30 +992,30 @@
   buildCounterProgram--;
 }
 
-buildUnnamed1179() {
+buildUnnamed1242() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1179(core.List<core.String> o) {
+checkUnnamed1242(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1180() {
+buildUnnamed1243() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1179();
-  o["y"] = buildUnnamed1179();
+  o["x"] = buildUnnamed1242();
+  o["y"] = buildUnnamed1242();
   return o;
 }
 
-checkUnnamed1180(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1243(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1179(o["x"]);
-  checkUnnamed1179(o["y"]);
+  checkUnnamed1242(o["x"]);
+  checkUnnamed1242(o["y"]);
 }
 
 core.int buildCounterRead = 0;
@@ -1046,7 +1036,7 @@
     o.position = 42;
     o.readsetId = "foo";
     o.referenceSequenceName = "foo";
-    o.tags = buildUnnamed1180();
+    o.tags = buildUnnamed1243();
     o.templateLength = 42;
   }
   buildCounterRead--;
@@ -1069,7 +1059,7 @@
     unittest.expect(o.position, unittest.equals(42));
     unittest.expect(o.readsetId, unittest.equals('foo'));
     unittest.expect(o.referenceSequenceName, unittest.equals('foo'));
-    checkUnnamed1180(o.tags);
+    checkUnnamed1243(o.tags);
     unittest.expect(o.templateLength, unittest.equals(42));
   }
   buildCounterRead--;
@@ -1116,14 +1106,14 @@
   buildCounterReadGroup--;
 }
 
-buildUnnamed1181() {
+buildUnnamed1244() {
   var o = new core.List<api.HeaderSection>();
   o.add(buildHeaderSection());
   o.add(buildHeaderSection());
   return o;
 }
 
-checkUnnamed1181(core.List<api.HeaderSection> o) {
+checkUnnamed1244(core.List<api.HeaderSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeaderSection(o[0]);
   checkHeaderSection(o[1]);
@@ -1135,7 +1125,7 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     o.datasetId = "foo";
-    o.fileData = buildUnnamed1181();
+    o.fileData = buildUnnamed1244();
     o.id = "foo";
     o.name = "foo";
   }
@@ -1147,7 +1137,7 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1181(o.fileData);
+    checkUnnamed1244(o.fileData);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -1204,14 +1194,14 @@
   buildCounterReferenceSequence--;
 }
 
-buildUnnamed1182() {
+buildUnnamed1245() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1182(core.List<core.String> o) {
+checkUnnamed1245(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1225,7 +1215,7 @@
     o.name = "foo";
     o.pageSize = 42;
     o.pageToken = "foo";
-    o.variantSetIds = buildUnnamed1182();
+    o.variantSetIds = buildUnnamed1245();
   }
   buildCounterSearchCallSetsRequest--;
   return o;
@@ -1237,19 +1227,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1182(o.variantSetIds);
+    checkUnnamed1245(o.variantSetIds);
   }
   buildCounterSearchCallSetsRequest--;
 }
 
-buildUnnamed1183() {
+buildUnnamed1246() {
   var o = new core.List<api.CallSet>();
   o.add(buildCallSet());
   o.add(buildCallSet());
   return o;
 }
 
-checkUnnamed1183(core.List<api.CallSet> o) {
+checkUnnamed1246(core.List<api.CallSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCallSet(o[0]);
   checkCallSet(o[1]);
@@ -1260,7 +1250,7 @@
   var o = new api.SearchCallSetsResponse();
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    o.callSets = buildUnnamed1183();
+    o.callSets = buildUnnamed1246();
     o.nextPageToken = "foo";
   }
   buildCounterSearchCallSetsResponse--;
@@ -1270,20 +1260,20 @@
 checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
   buildCounterSearchCallSetsResponse++;
   if (buildCounterSearchCallSetsResponse < 3) {
-    checkUnnamed1183(o.callSets);
+    checkUnnamed1246(o.callSets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchCallSetsResponse--;
 }
 
-buildUnnamed1184() {
+buildUnnamed1247() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1184(core.List<core.String> o) {
+checkUnnamed1247(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1299,7 +1289,7 @@
     o.maxResults = "foo";
     o.pageToken = "foo";
     o.projectId = "foo";
-    o.status = buildUnnamed1184();
+    o.status = buildUnnamed1247();
   }
   buildCounterSearchJobsRequest--;
   return o;
@@ -1313,19 +1303,19 @@
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1184(o.status);
+    checkUnnamed1247(o.status);
   }
   buildCounterSearchJobsRequest--;
 }
 
-buildUnnamed1185() {
+buildUnnamed1248() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed1185(core.List<api.Job> o) {
+checkUnnamed1248(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -1336,7 +1326,7 @@
   var o = new api.SearchJobsResponse();
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    o.jobs = buildUnnamed1185();
+    o.jobs = buildUnnamed1248();
     o.nextPageToken = "foo";
   }
   buildCounterSearchJobsResponse--;
@@ -1346,20 +1336,20 @@
 checkSearchJobsResponse(api.SearchJobsResponse o) {
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    checkUnnamed1185(o.jobs);
+    checkUnnamed1248(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchJobsResponse--;
 }
 
-buildUnnamed1186() {
+buildUnnamed1249() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1186(core.List<core.String> o) {
+checkUnnamed1249(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1372,7 +1362,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     o.maxResults = "foo";
     o.pageToken = "foo";
-    o.readsetIds = buildUnnamed1186();
+    o.readsetIds = buildUnnamed1249();
     o.sequenceEnd = "foo";
     o.sequenceName = "foo";
     o.sequenceStart = "foo";
@@ -1386,7 +1376,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1186(o.readsetIds);
+    checkUnnamed1249(o.readsetIds);
     unittest.expect(o.sequenceEnd, unittest.equals('foo'));
     unittest.expect(o.sequenceName, unittest.equals('foo'));
     unittest.expect(o.sequenceStart, unittest.equals('foo'));
@@ -1394,14 +1384,14 @@
   buildCounterSearchReadsRequest--;
 }
 
-buildUnnamed1187() {
+buildUnnamed1250() {
   var o = new core.List<api.Read>();
   o.add(buildRead());
   o.add(buildRead());
   return o;
 }
 
-checkUnnamed1187(core.List<api.Read> o) {
+checkUnnamed1250(core.List<api.Read> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRead(o[0]);
   checkRead(o[1]);
@@ -1413,7 +1403,7 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     o.nextPageToken = "foo";
-    o.reads = buildUnnamed1187();
+    o.reads = buildUnnamed1250();
   }
   buildCounterSearchReadsResponse--;
   return o;
@@ -1423,19 +1413,19 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1187(o.reads);
+    checkUnnamed1250(o.reads);
   }
   buildCounterSearchReadsResponse--;
 }
 
-buildUnnamed1188() {
+buildUnnamed1251() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1188(core.List<core.String> o) {
+checkUnnamed1251(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1446,7 +1436,7 @@
   var o = new api.SearchReadsetsRequest();
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    o.datasetIds = buildUnnamed1188();
+    o.datasetIds = buildUnnamed1251();
     o.maxResults = "foo";
     o.name = "foo";
     o.pageToken = "foo";
@@ -1458,7 +1448,7 @@
 checkSearchReadsetsRequest(api.SearchReadsetsRequest o) {
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    checkUnnamed1188(o.datasetIds);
+    checkUnnamed1251(o.datasetIds);
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
@@ -1466,14 +1456,14 @@
   buildCounterSearchReadsetsRequest--;
 }
 
-buildUnnamed1189() {
+buildUnnamed1252() {
   var o = new core.List<api.Readset>();
   o.add(buildReadset());
   o.add(buildReadset());
   return o;
 }
 
-checkUnnamed1189(core.List<api.Readset> o) {
+checkUnnamed1252(core.List<api.Readset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadset(o[0]);
   checkReadset(o[1]);
@@ -1485,7 +1475,7 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.readsets = buildUnnamed1189();
+    o.readsets = buildUnnamed1252();
   }
   buildCounterSearchReadsetsResponse--;
   return o;
@@ -1495,19 +1485,19 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1189(o.readsets);
+    checkUnnamed1252(o.readsets);
   }
   buildCounterSearchReadsetsResponse--;
 }
 
-buildUnnamed1190() {
+buildUnnamed1253() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1190(core.List<core.String> o) {
+checkUnnamed1253(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1518,7 +1508,7 @@
   var o = new api.SearchVariantSetsRequest();
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    o.datasetIds = buildUnnamed1190();
+    o.datasetIds = buildUnnamed1253();
     o.pageSize = 42;
     o.pageToken = "foo";
   }
@@ -1529,21 +1519,21 @@
 checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
   buildCounterSearchVariantSetsRequest++;
   if (buildCounterSearchVariantSetsRequest < 3) {
-    checkUnnamed1190(o.datasetIds);
+    checkUnnamed1253(o.datasetIds);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
   buildCounterSearchVariantSetsRequest--;
 }
 
-buildUnnamed1191() {
+buildUnnamed1254() {
   var o = new core.List<api.VariantSet>();
   o.add(buildVariantSet());
   o.add(buildVariantSet());
   return o;
 }
 
-checkUnnamed1191(core.List<api.VariantSet> o) {
+checkUnnamed1254(core.List<api.VariantSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariantSet(o[0]);
   checkVariantSet(o[1]);
@@ -1555,7 +1545,7 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variantSets = buildUnnamed1191();
+    o.variantSets = buildUnnamed1254();
   }
   buildCounterSearchVariantSetsResponse--;
   return o;
@@ -1565,32 +1555,32 @@
   buildCounterSearchVariantSetsResponse++;
   if (buildCounterSearchVariantSetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1191(o.variantSets);
+    checkUnnamed1254(o.variantSets);
   }
   buildCounterSearchVariantSetsResponse--;
 }
 
-buildUnnamed1192() {
+buildUnnamed1255() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1192(core.List<core.String> o) {
+checkUnnamed1255(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1193() {
+buildUnnamed1256() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1193(core.List<core.String> o) {
+checkUnnamed1256(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1601,7 +1591,7 @@
   var o = new api.SearchVariantsRequest();
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    o.callSetIds = buildUnnamed1192();
+    o.callSetIds = buildUnnamed1255();
     o.end = "foo";
     o.maxCalls = 42;
     o.pageSize = 42;
@@ -1609,7 +1599,7 @@
     o.referenceName = "foo";
     o.start = "foo";
     o.variantName = "foo";
-    o.variantSetIds = buildUnnamed1193();
+    o.variantSetIds = buildUnnamed1256();
   }
   buildCounterSearchVariantsRequest--;
   return o;
@@ -1618,7 +1608,7 @@
 checkSearchVariantsRequest(api.SearchVariantsRequest o) {
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    checkUnnamed1192(o.callSetIds);
+    checkUnnamed1255(o.callSetIds);
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.maxCalls, unittest.equals(42));
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -1626,19 +1616,19 @@
     unittest.expect(o.referenceName, unittest.equals('foo'));
     unittest.expect(o.start, unittest.equals('foo'));
     unittest.expect(o.variantName, unittest.equals('foo'));
-    checkUnnamed1193(o.variantSetIds);
+    checkUnnamed1256(o.variantSetIds);
   }
   buildCounterSearchVariantsRequest--;
 }
 
-buildUnnamed1194() {
+buildUnnamed1257() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1194(core.List<api.Variant> o) {
+checkUnnamed1257(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -1650,7 +1640,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variants = buildUnnamed1194();
+    o.variants = buildUnnamed1257();
   }
   buildCounterSearchVariantsResponse--;
   return o;
@@ -1660,84 +1650,84 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1194(o.variants);
+    checkUnnamed1257(o.variants);
   }
   buildCounterSearchVariantsResponse--;
 }
 
-buildUnnamed1195() {
+buildUnnamed1258() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1195(core.List<core.String> o) {
+checkUnnamed1258(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1196() {
+buildUnnamed1259() {
   var o = new core.List<api.Call>();
   o.add(buildCall());
   o.add(buildCall());
   return o;
 }
 
-checkUnnamed1196(core.List<api.Call> o) {
+checkUnnamed1259(core.List<api.Call> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCall(o[0]);
   checkCall(o[1]);
 }
 
-buildUnnamed1197() {
+buildUnnamed1260() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1197(core.List<core.String> o) {
+checkUnnamed1260(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1198() {
+buildUnnamed1261() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1198(core.List<core.String> o) {
+checkUnnamed1261(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1199() {
+buildUnnamed1262() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1198();
-  o["y"] = buildUnnamed1198();
+  o["x"] = buildUnnamed1261();
+  o["y"] = buildUnnamed1261();
   return o;
 }
 
-checkUnnamed1199(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1262(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1198(o["x"]);
-  checkUnnamed1198(o["y"]);
+  checkUnnamed1261(o["x"]);
+  checkUnnamed1261(o["y"]);
 }
 
-buildUnnamed1200() {
+buildUnnamed1263() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1200(core.List<core.String> o) {
+checkUnnamed1263(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1748,14 +1738,14 @@
   var o = new api.Variant();
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    o.alternateBases = buildUnnamed1195();
-    o.calls = buildUnnamed1196();
+    o.alternateBases = buildUnnamed1258();
+    o.calls = buildUnnamed1259();
     o.created = "foo";
     o.end = "foo";
-    o.filter = buildUnnamed1197();
+    o.filter = buildUnnamed1260();
     o.id = "foo";
-    o.info = buildUnnamed1199();
-    o.names = buildUnnamed1200();
+    o.info = buildUnnamed1262();
+    o.names = buildUnnamed1263();
     o.quality = 42.0;
     o.referenceBases = "foo";
     o.referenceName = "foo";
@@ -1769,14 +1759,14 @@
 checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkUnnamed1195(o.alternateBases);
-    checkUnnamed1196(o.calls);
+    checkUnnamed1258(o.alternateBases);
+    checkUnnamed1259(o.calls);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
-    checkUnnamed1197(o.filter);
+    checkUnnamed1260(o.filter);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1199(o.info);
-    checkUnnamed1200(o.names);
+    checkUnnamed1262(o.info);
+    checkUnnamed1263(o.names);
     unittest.expect(o.quality, unittest.equals(42.0));
     unittest.expect(o.referenceBases, unittest.equals('foo'));
     unittest.expect(o.referenceName, unittest.equals('foo'));
@@ -1786,27 +1776,27 @@
   buildCounterVariant--;
 }
 
-buildUnnamed1201() {
+buildUnnamed1264() {
   var o = new core.List<api.Metadata>();
   o.add(buildMetadata());
   o.add(buildMetadata());
   return o;
 }
 
-checkUnnamed1201(core.List<api.Metadata> o) {
+checkUnnamed1264(core.List<api.Metadata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadata(o[0]);
   checkMetadata(o[1]);
 }
 
-buildUnnamed1202() {
+buildUnnamed1265() {
   var o = new core.List<api.ReferenceBound>();
   o.add(buildReferenceBound());
   o.add(buildReferenceBound());
   return o;
 }
 
-checkUnnamed1202(core.List<api.ReferenceBound> o) {
+checkUnnamed1265(core.List<api.ReferenceBound> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceBound(o[0]);
   checkReferenceBound(o[1]);
@@ -1819,8 +1809,8 @@
   if (buildCounterVariantSet < 3) {
     o.datasetId = "foo";
     o.id = "foo";
-    o.metadata = buildUnnamed1201();
-    o.referenceBounds = buildUnnamed1202();
+    o.metadata = buildUnnamed1264();
+    o.referenceBounds = buildUnnamed1265();
   }
   buildCounterVariantSet--;
   return o;
@@ -1831,8 +1821,8 @@
   if (buildCounterVariantSet < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1201(o.metadata);
-    checkUnnamed1202(o.referenceBounds);
+    checkUnnamed1264(o.metadata);
+    checkUnnamed1265(o.referenceBounds);
   }
   buildCounterVariantSet--;
 }
@@ -4139,6 +4129,59 @@
       res.mergeVariants(arg_request, arg_variantSetId).then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildVariantSet();
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.VariantSet.fromJson(json);
+        checkVariantSet(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildVariantSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_variantSetId).then(unittest.expectAsync(((api.VariantSet response) {
+        checkVariantSet(response);
+      })));
+    });
+
     unittest.test("method--search", () {
 
       var mock = new common_test.HttpServerMock();
@@ -4188,6 +4231,59 @@
       })));
     });
 
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildVariantSet();
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.VariantSet.fromJson(json);
+        checkVariantSet(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildVariantSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_variantSetId).then(unittest.expectAsync(((api.VariantSet response) {
+        checkVariantSet(response);
+      })));
+    });
+
   });
 
 
diff --git a/generated/googleapis_beta/test/manager/v1beta2_test.dart b/generated/googleapis_beta/test/manager/v1beta2_test.dart
index 397cd6c..3e995c2 100644
--- a/generated/googleapis_beta/test/manager/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/manager/v1beta2_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed1117() {
+buildUnnamed1183() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1117(core.List<core.String> o) {
+checkUnnamed1183(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -57,7 +57,7 @@
   var o = new api.Action();
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    o.commands = buildUnnamed1117();
+    o.commands = buildUnnamed1183();
     o.timeoutMs = 42;
   }
   buildCounterAction--;
@@ -67,20 +67,20 @@
 checkAction(api.Action o) {
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    checkUnnamed1117(o.commands);
+    checkUnnamed1183(o.commands);
     unittest.expect(o.timeoutMs, unittest.equals(42));
   }
   buildCounterAction--;
 }
 
-buildUnnamed1118() {
+buildUnnamed1184() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1118(core.List<core.String> o) {
+checkUnnamed1184(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -92,7 +92,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed1118();
+    o.ports = buildUnnamed1184();
   }
   buildCounterAllowedRule--;
   return o;
@@ -102,7 +102,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed1118(o.ports);
+    checkUnnamed1184(o.ports);
   }
   buildCounterAllowedRule--;
 }
@@ -178,27 +178,27 @@
   buildCounterDeployState--;
 }
 
-buildUnnamed1119() {
+buildUnnamed1185() {
   var o = new core.Map<core.String, api.ModuleStatus>();
   o["x"] = buildModuleStatus();
   o["y"] = buildModuleStatus();
   return o;
 }
 
-checkUnnamed1119(core.Map<core.String, api.ModuleStatus> o) {
+checkUnnamed1185(core.Map<core.String, api.ModuleStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModuleStatus(o["x"]);
   checkModuleStatus(o["y"]);
 }
 
-buildUnnamed1120() {
+buildUnnamed1186() {
   var o = new core.List<api.ParamOverride>();
   o.add(buildParamOverride());
   o.add(buildParamOverride());
   return o;
 }
 
-checkUnnamed1120(core.List<api.ParamOverride> o) {
+checkUnnamed1186(core.List<api.ParamOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParamOverride(o[0]);
   checkParamOverride(o[1]);
@@ -211,9 +211,9 @@
   if (buildCounterDeployment < 3) {
     o.creationDate = "foo";
     o.description = "foo";
-    o.modules = buildUnnamed1119();
+    o.modules = buildUnnamed1185();
     o.name = "foo";
-    o.overrides = buildUnnamed1120();
+    o.overrides = buildUnnamed1186();
     o.state = buildDeployState();
     o.templateName = "foo";
   }
@@ -226,23 +226,23 @@
   if (buildCounterDeployment < 3) {
     unittest.expect(o.creationDate, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1119(o.modules);
+    checkUnnamed1185(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1120(o.overrides);
+    checkUnnamed1186(o.overrides);
     checkDeployState(o.state);
     unittest.expect(o.templateName, unittest.equals('foo'));
   }
   buildCounterDeployment--;
 }
 
-buildUnnamed1121() {
+buildUnnamed1187() {
   var o = new core.List<api.Deployment>();
   o.add(buildDeployment());
   o.add(buildDeployment());
   return o;
 }
 
-checkUnnamed1121(core.List<api.Deployment> o) {
+checkUnnamed1187(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeployment(o[0]);
   checkDeployment(o[1]);
@@ -254,7 +254,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1121();
+    o.resources = buildUnnamed1187();
   }
   buildCounterDeploymentsListResponse--;
   return o;
@@ -264,7 +264,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1121(o.resources);
+    checkUnnamed1187(o.resources);
   }
   buildCounterDeploymentsListResponse--;
 }
@@ -332,53 +332,53 @@
   buildCounterExistingDisk--;
 }
 
-buildUnnamed1122() {
+buildUnnamed1188() {
   var o = new core.List<api.AllowedRule>();
   o.add(buildAllowedRule());
   o.add(buildAllowedRule());
   return o;
 }
 
-checkUnnamed1122(core.List<api.AllowedRule> o) {
+checkUnnamed1188(core.List<api.AllowedRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAllowedRule(o[0]);
   checkAllowedRule(o[1]);
 }
 
-buildUnnamed1123() {
+buildUnnamed1189() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1123(core.List<core.String> o) {
+checkUnnamed1189(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1124() {
+buildUnnamed1190() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1124(core.List<core.String> o) {
+checkUnnamed1190(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1125() {
+buildUnnamed1191() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1125(core.List<core.String> o) {
+checkUnnamed1191(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -389,12 +389,12 @@
   var o = new api.FirewallModule();
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    o.allowed = buildUnnamed1122();
+    o.allowed = buildUnnamed1188();
     o.description = "foo";
     o.network = "foo";
-    o.sourceRanges = buildUnnamed1123();
-    o.sourceTags = buildUnnamed1124();
-    o.targetTags = buildUnnamed1125();
+    o.sourceRanges = buildUnnamed1189();
+    o.sourceTags = buildUnnamed1190();
+    o.targetTags = buildUnnamed1191();
   }
   buildCounterFirewallModule--;
   return o;
@@ -403,12 +403,12 @@
 checkFirewallModule(api.FirewallModule o) {
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    checkUnnamed1122(o.allowed);
+    checkUnnamed1188(o.allowed);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed1123(o.sourceRanges);
-    checkUnnamed1124(o.sourceTags);
-    checkUnnamed1125(o.targetTags);
+    checkUnnamed1189(o.sourceRanges);
+    checkUnnamed1190(o.sourceTags);
+    checkUnnamed1191(o.targetTags);
   }
   buildCounterFirewallModule--;
 }
@@ -484,27 +484,27 @@
   buildCounterHealthCheckModuleStatus--;
 }
 
-buildUnnamed1126() {
+buildUnnamed1192() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1126(core.List<core.String> o) {
+checkUnnamed1192(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1127() {
+buildUnnamed1193() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1127(core.List<core.String> o) {
+checkUnnamed1193(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -516,12 +516,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     o.description = "foo";
-    o.healthChecks = buildUnnamed1126();
+    o.healthChecks = buildUnnamed1192();
     o.ipAddress = "foo";
     o.ipProtocol = "foo";
     o.portRange = "foo";
     o.sessionAffinity = "foo";
-    o.targetModules = buildUnnamed1127();
+    o.targetModules = buildUnnamed1193();
   }
   buildCounterLbModule--;
   return o;
@@ -531,12 +531,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1126(o.healthChecks);
+    checkUnnamed1192(o.healthChecks);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.ipProtocol, unittest.equals('foo'));
     unittest.expect(o.portRange, unittest.equals('foo'));
     unittest.expect(o.sessionAffinity, unittest.equals('foo'));
-    checkUnnamed1127(o.targetModules);
+    checkUnnamed1193(o.targetModules);
   }
   buildCounterLbModule--;
 }
@@ -562,14 +562,14 @@
   buildCounterLbModuleStatus--;
 }
 
-buildUnnamed1128() {
+buildUnnamed1194() {
   var o = new core.List<api.MetadataItem>();
   o.add(buildMetadataItem());
   o.add(buildMetadataItem());
   return o;
 }
 
-checkUnnamed1128(core.List<api.MetadataItem> o) {
+checkUnnamed1194(core.List<api.MetadataItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItem(o[0]);
   checkMetadataItem(o[1]);
@@ -581,7 +581,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1128();
+    o.items = buildUnnamed1194();
   }
   buildCounterMetadata--;
   return o;
@@ -591,7 +591,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1128(o.items);
+    checkUnnamed1194(o.items);
   }
   buildCounterMetadata--;
 }
@@ -681,14 +681,14 @@
   buildCounterModuleStatus--;
 }
 
-buildUnnamed1129() {
+buildUnnamed1195() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed1129(core.List<api.AccessConfig> o) {
+checkUnnamed1195(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -699,7 +699,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed1129();
+    o.accessConfigs = buildUnnamed1195();
     o.name = "foo";
     o.network = "foo";
     o.networkIp = "foo";
@@ -711,7 +711,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed1129(o.accessConfigs);
+    checkUnnamed1195(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIp, unittest.equals('foo'));
@@ -830,27 +830,27 @@
   buildCounterParamOverride--;
 }
 
-buildUnnamed1130() {
+buildUnnamed1196() {
   var o = new core.Map<core.String, api.EnvVariable>();
   o["x"] = buildEnvVariable();
   o["y"] = buildEnvVariable();
   return o;
 }
 
-checkUnnamed1130(core.Map<core.String, api.EnvVariable> o) {
+checkUnnamed1196(core.Map<core.String, api.EnvVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvVariable(o["x"]);
   checkEnvVariable(o["y"]);
 }
 
-buildUnnamed1131() {
+buildUnnamed1197() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1131(core.List<core.String> o) {
+checkUnnamed1197(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -861,8 +861,8 @@
   var o = new api.ReplicaPoolModule();
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    o.envVariables = buildUnnamed1130();
-    o.healthChecks = buildUnnamed1131();
+    o.envVariables = buildUnnamed1196();
+    o.healthChecks = buildUnnamed1197();
     o.numReplicas = 42;
     o.replicaPoolParams = buildReplicaPoolParams();
     o.resourceView = "foo";
@@ -874,8 +874,8 @@
 checkReplicaPoolModule(api.ReplicaPoolModule o) {
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    checkUnnamed1130(o.envVariables);
-    checkUnnamed1131(o.healthChecks);
+    checkUnnamed1196(o.envVariables);
+    checkUnnamed1197(o.healthChecks);
     unittest.expect(o.numReplicas, unittest.equals(42));
     checkReplicaPoolParams(o.replicaPoolParams);
     unittest.expect(o.resourceView, unittest.equals('foo'));
@@ -923,53 +923,53 @@
   buildCounterReplicaPoolParams--;
 }
 
-buildUnnamed1132() {
+buildUnnamed1198() {
   var o = new core.List<api.ExistingDisk>();
   o.add(buildExistingDisk());
   o.add(buildExistingDisk());
   return o;
 }
 
-checkUnnamed1132(core.List<api.ExistingDisk> o) {
+checkUnnamed1198(core.List<api.ExistingDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExistingDisk(o[0]);
   checkExistingDisk(o[1]);
 }
 
-buildUnnamed1133() {
+buildUnnamed1199() {
   var o = new core.List<api.NewDisk>();
   o.add(buildNewDisk());
   o.add(buildNewDisk());
   return o;
 }
 
-checkUnnamed1133(core.List<api.NewDisk> o) {
+checkUnnamed1199(core.List<api.NewDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNewDisk(o[0]);
   checkNewDisk(o[1]);
 }
 
-buildUnnamed1134() {
+buildUnnamed1200() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed1134(core.List<api.NetworkInterface> o) {
+checkUnnamed1200(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed1135() {
+buildUnnamed1201() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed1135(core.List<api.ServiceAccount> o) {
+checkUnnamed1201(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -984,14 +984,14 @@
     o.baseInstanceName = "foo";
     o.canIpForward = true;
     o.description = "foo";
-    o.disksToAttach = buildUnnamed1132();
-    o.disksToCreate = buildUnnamed1133();
+    o.disksToAttach = buildUnnamed1198();
+    o.disksToCreate = buildUnnamed1199();
     o.initAction = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed1134();
+    o.networkInterfaces = buildUnnamed1200();
     o.onHostMaintenance = "foo";
-    o.serviceAccounts = buildUnnamed1135();
+    o.serviceAccounts = buildUnnamed1201();
     o.tags = buildTag();
     o.zone = "foo";
   }
@@ -1006,28 +1006,28 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1132(o.disksToAttach);
-    checkUnnamed1133(o.disksToCreate);
+    checkUnnamed1198(o.disksToAttach);
+    checkUnnamed1199(o.disksToCreate);
     unittest.expect(o.initAction, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed1134(o.networkInterfaces);
+    checkUnnamed1200(o.networkInterfaces);
     unittest.expect(o.onHostMaintenance, unittest.equals('foo'));
-    checkUnnamed1135(o.serviceAccounts);
+    checkUnnamed1201(o.serviceAccounts);
     checkTag(o.tags);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterReplicaPoolParamsV1Beta1--;
 }
 
-buildUnnamed1136() {
+buildUnnamed1202() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1136(core.List<core.String> o) {
+checkUnnamed1202(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1039,7 +1039,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed1136();
+    o.scopes = buildUnnamed1202();
   }
   buildCounterServiceAccount--;
   return o;
@@ -1049,19 +1049,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed1136(o.scopes);
+    checkUnnamed1202(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed1137() {
+buildUnnamed1203() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1137(core.List<core.String> o) {
+checkUnnamed1203(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1073,7 +1073,7 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1137();
+    o.items = buildUnnamed1203();
   }
   buildCounterTag--;
   return o;
@@ -1083,32 +1083,32 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1137(o.items);
+    checkUnnamed1203(o.items);
   }
   buildCounterTag--;
 }
 
-buildUnnamed1138() {
+buildUnnamed1204() {
   var o = new core.Map<core.String, api.Action>();
   o["x"] = buildAction();
   o["y"] = buildAction();
   return o;
 }
 
-checkUnnamed1138(core.Map<core.String, api.Action> o) {
+checkUnnamed1204(core.Map<core.String, api.Action> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAction(o["x"]);
   checkAction(o["y"]);
 }
 
-buildUnnamed1139() {
+buildUnnamed1205() {
   var o = new core.Map<core.String, api.Module>();
   o["x"] = buildModule();
   o["y"] = buildModule();
   return o;
 }
 
-checkUnnamed1139(core.Map<core.String, api.Module> o) {
+checkUnnamed1205(core.Map<core.String, api.Module> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModule(o["x"]);
   checkModule(o["y"]);
@@ -1119,9 +1119,9 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.actions = buildUnnamed1138();
+    o.actions = buildUnnamed1204();
     o.description = "foo";
-    o.modules = buildUnnamed1139();
+    o.modules = buildUnnamed1205();
     o.name = "foo";
   }
   buildCounterTemplate--;
@@ -1131,22 +1131,22 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed1138(o.actions);
+    checkUnnamed1204(o.actions);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1139(o.modules);
+    checkUnnamed1205(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterTemplate--;
 }
 
-buildUnnamed1140() {
+buildUnnamed1206() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed1140(core.List<api.Template> o) {
+checkUnnamed1206(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -1158,7 +1158,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1140();
+    o.resources = buildUnnamed1206();
   }
   buildCounterTemplatesListResponse--;
   return o;
@@ -1168,7 +1168,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1140(o.resources);
+    checkUnnamed1206(o.resources);
   }
   buildCounterTemplatesListResponse--;
 }
diff --git a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
index 518bb38..35cea17 100644
--- a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1141() {
+buildUnnamed1266() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1141(core.List<core.String> o) {
+checkUnnamed1266(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AcknowledgeRequest();
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    o.ackId = buildUnnamed1141();
+    o.ackId = buildUnnamed1266();
     o.subscription = "foo";
   }
   buildCounterAcknowledgeRequest--;
@@ -44,7 +44,7 @@
 checkAcknowledgeRequest(api.AcknowledgeRequest o) {
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    checkUnnamed1141(o.ackId);
+    checkUnnamed1266(o.ackId);
     unittest.expect(o.subscription, unittest.equals('foo'));
   }
   buildCounterAcknowledgeRequest--;
@@ -73,14 +73,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1142() {
+buildUnnamed1267() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1142(core.List<api.Subscription> o) {
+checkUnnamed1267(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -92,7 +92,7 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.subscription = buildUnnamed1142();
+    o.subscription = buildUnnamed1267();
   }
   buildCounterListSubscriptionsResponse--;
   return o;
@@ -102,19 +102,19 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1142(o.subscription);
+    checkUnnamed1267(o.subscription);
   }
   buildCounterListSubscriptionsResponse--;
 }
 
-buildUnnamed1143() {
+buildUnnamed1268() {
   var o = new core.List<api.Topic>();
   o.add(buildTopic());
   o.add(buildTopic());
   return o;
 }
 
-checkUnnamed1143(core.List<api.Topic> o) {
+checkUnnamed1268(core.List<api.Topic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTopic(o[0]);
   checkTopic(o[1]);
@@ -126,7 +126,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     o.nextPageToken = "foo";
-    o.topic = buildUnnamed1143();
+    o.topic = buildUnnamed1268();
   }
   buildCounterListTopicsResponse--;
   return o;
@@ -136,7 +136,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1143(o.topic);
+    checkUnnamed1268(o.topic);
   }
   buildCounterListTopicsResponse--;
 }
@@ -231,14 +231,14 @@
   buildCounterPubsubEvent--;
 }
 
-buildUnnamed1144() {
+buildUnnamed1269() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1144(core.List<api.Label> o) {
+checkUnnamed1269(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -250,7 +250,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     o.data = "foo";
-    o.label = buildUnnamed1144();
+    o.label = buildUnnamed1269();
   }
   buildCounterPubsubMessage--;
   return o;
@@ -260,7 +260,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     unittest.expect(o.data, unittest.equals('foo'));
-    checkUnnamed1144(o.label);
+    checkUnnamed1269(o.label);
   }
   buildCounterPubsubMessage--;
 }
diff --git a/generated/googleapis_beta/test/replicapool/v1beta1_test.dart b/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
index f47404a..87c501b 100644
--- a/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
@@ -39,27 +39,27 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed1243() {
+buildUnnamed1150() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1243(core.List<core.String> o) {
+checkUnnamed1150(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1244() {
+buildUnnamed1151() {
   var o = new core.List<api.EnvVariable>();
   o.add(buildEnvVariable());
   o.add(buildEnvVariable());
   return o;
 }
 
-checkUnnamed1244(core.List<api.EnvVariable> o) {
+checkUnnamed1151(core.List<api.EnvVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvVariable(o[0]);
   checkEnvVariable(o[1]);
@@ -70,8 +70,8 @@
   var o = new api.Action();
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    o.commands = buildUnnamed1243();
-    o.envVariables = buildUnnamed1244();
+    o.commands = buildUnnamed1150();
+    o.envVariables = buildUnnamed1151();
     o.timeoutMilliSeconds = 42;
   }
   buildCounterAction--;
@@ -81,8 +81,8 @@
 checkAction(api.Action o) {
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    checkUnnamed1243(o.commands);
-    checkUnnamed1244(o.envVariables);
+    checkUnnamed1150(o.commands);
+    checkUnnamed1151(o.envVariables);
     unittest.expect(o.timeoutMilliSeconds, unittest.equals(42));
   }
   buildCounterAction--;
@@ -209,14 +209,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1245() {
+buildUnnamed1152() {
   var o = new core.List<api.MetadataItem>();
   o.add(buildMetadataItem());
   o.add(buildMetadataItem());
   return o;
 }
 
-checkUnnamed1245(core.List<api.MetadataItem> o) {
+checkUnnamed1152(core.List<api.MetadataItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItem(o[0]);
   checkMetadataItem(o[1]);
@@ -228,7 +228,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1245();
+    o.items = buildUnnamed1152();
   }
   buildCounterMetadata--;
   return o;
@@ -238,7 +238,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1245(o.items);
+    checkUnnamed1152(o.items);
   }
   buildCounterMetadata--;
 }
@@ -264,14 +264,14 @@
   buildCounterMetadataItem--;
 }
 
-buildUnnamed1246() {
+buildUnnamed1153() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed1246(core.List<api.AccessConfig> o) {
+checkUnnamed1153(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -282,7 +282,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed1246();
+    o.accessConfigs = buildUnnamed1153();
     o.network = "foo";
     o.networkIp = "foo";
   }
@@ -293,7 +293,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed1246(o.accessConfigs);
+    checkUnnamed1153(o.accessConfigs);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIp, unittest.equals('foo'));
   }
@@ -348,53 +348,53 @@
   buildCounterNewDiskInitializeParams--;
 }
 
-buildUnnamed1247() {
+buildUnnamed1154() {
   var o = new core.List<api.HealthCheck>();
   o.add(buildHealthCheck());
   o.add(buildHealthCheck());
   return o;
 }
 
-checkUnnamed1247(core.List<api.HealthCheck> o) {
+checkUnnamed1154(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheck(o[0]);
   checkHealthCheck(o[1]);
 }
 
-buildUnnamed1248() {
+buildUnnamed1155() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1248(core.List<api.Label> o) {
+checkUnnamed1155(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1249() {
+buildUnnamed1156() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1249(core.List<core.String> o) {
+checkUnnamed1156(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1250() {
+buildUnnamed1157() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1250(core.List<core.String> o) {
+checkUnnamed1157(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -409,15 +409,15 @@
     o.baseInstanceName = "foo";
     o.currentNumReplicas = 42;
     o.description = "foo";
-    o.healthChecks = buildUnnamed1247();
+    o.healthChecks = buildUnnamed1154();
     o.initialNumReplicas = 42;
-    o.labels = buildUnnamed1248();
+    o.labels = buildUnnamed1155();
     o.name = "foo";
     o.numReplicas = 42;
-    o.resourceViews = buildUnnamed1249();
+    o.resourceViews = buildUnnamed1156();
     o.selfLink = "foo";
     o.targetPool = "foo";
-    o.targetPools = buildUnnamed1250();
+    o.targetPools = buildUnnamed1157();
     o.template = buildTemplate();
     o.type = "foo";
   }
@@ -432,29 +432,29 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.currentNumReplicas, unittest.equals(42));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1247(o.healthChecks);
+    checkUnnamed1154(o.healthChecks);
     unittest.expect(o.initialNumReplicas, unittest.equals(42));
-    checkUnnamed1248(o.labels);
+    checkUnnamed1155(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numReplicas, unittest.equals(42));
-    checkUnnamed1249(o.resourceViews);
+    checkUnnamed1156(o.resourceViews);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.targetPool, unittest.equals('foo'));
-    checkUnnamed1250(o.targetPools);
+    checkUnnamed1157(o.targetPools);
     checkTemplate(o.template);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPool--;
 }
 
-buildUnnamed1251() {
+buildUnnamed1158() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1251(core.List<core.String> o) {
+checkUnnamed1158(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -465,7 +465,7 @@
   var o = new api.PoolsDeleteRequest();
   buildCounterPoolsDeleteRequest++;
   if (buildCounterPoolsDeleteRequest < 3) {
-    o.abandonInstances = buildUnnamed1251();
+    o.abandonInstances = buildUnnamed1158();
   }
   buildCounterPoolsDeleteRequest--;
   return o;
@@ -474,19 +474,19 @@
 checkPoolsDeleteRequest(api.PoolsDeleteRequest o) {
   buildCounterPoolsDeleteRequest++;
   if (buildCounterPoolsDeleteRequest < 3) {
-    checkUnnamed1251(o.abandonInstances);
+    checkUnnamed1158(o.abandonInstances);
   }
   buildCounterPoolsDeleteRequest--;
 }
 
-buildUnnamed1252() {
+buildUnnamed1159() {
   var o = new core.List<api.Pool>();
   o.add(buildPool());
   o.add(buildPool());
   return o;
 }
 
-checkUnnamed1252(core.List<api.Pool> o) {
+checkUnnamed1159(core.List<api.Pool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPool(o[0]);
   checkPool(o[1]);
@@ -498,7 +498,7 @@
   buildCounterPoolsListResponse++;
   if (buildCounterPoolsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1252();
+    o.resources = buildUnnamed1159();
   }
   buildCounterPoolsListResponse--;
   return o;
@@ -508,7 +508,7 @@
   buildCounterPoolsListResponse++;
   if (buildCounterPoolsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1252(o.resources);
+    checkUnnamed1159(o.resources);
   }
   buildCounterPoolsListResponse--;
 }
@@ -582,14 +582,14 @@
   buildCounterReplicasDeleteRequest--;
 }
 
-buildUnnamed1253() {
+buildUnnamed1160() {
   var o = new core.List<api.Replica>();
   o.add(buildReplica());
   o.add(buildReplica());
   return o;
 }
 
-checkUnnamed1253(core.List<api.Replica> o) {
+checkUnnamed1160(core.List<api.Replica> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReplica(o[0]);
   checkReplica(o[1]);
@@ -601,7 +601,7 @@
   buildCounterReplicasListResponse++;
   if (buildCounterReplicasListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1253();
+    o.resources = buildUnnamed1160();
   }
   buildCounterReplicasListResponse--;
   return o;
@@ -611,19 +611,19 @@
   buildCounterReplicasListResponse++;
   if (buildCounterReplicasListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1253(o.resources);
+    checkUnnamed1160(o.resources);
   }
   buildCounterReplicasListResponse--;
 }
 
-buildUnnamed1254() {
+buildUnnamed1161() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1254(core.List<core.String> o) {
+checkUnnamed1161(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -635,7 +635,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed1254();
+    o.scopes = buildUnnamed1161();
   }
   buildCounterServiceAccount--;
   return o;
@@ -645,19 +645,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed1254(o.scopes);
+    checkUnnamed1161(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed1255() {
+buildUnnamed1162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1255(core.List<core.String> o) {
+checkUnnamed1162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -669,7 +669,7 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1255();
+    o.items = buildUnnamed1162();
   }
   buildCounterTag--;
   return o;
@@ -679,19 +679,19 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1255(o.items);
+    checkUnnamed1162(o.items);
   }
   buildCounterTag--;
 }
 
-buildUnnamed1256() {
+buildUnnamed1163() {
   var o = new core.List<api.HealthCheck>();
   o.add(buildHealthCheck());
   o.add(buildHealthCheck());
   return o;
 }
 
-checkUnnamed1256(core.List<api.HealthCheck> o) {
+checkUnnamed1163(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheck(o[0]);
   checkHealthCheck(o[1]);
@@ -703,7 +703,7 @@
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
     o.action = buildAction();
-    o.healthChecks = buildUnnamed1256();
+    o.healthChecks = buildUnnamed1163();
     o.version = "foo";
     o.vmParams = buildVmParams();
   }
@@ -715,60 +715,60 @@
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
     checkAction(o.action);
-    checkUnnamed1256(o.healthChecks);
+    checkUnnamed1163(o.healthChecks);
     unittest.expect(o.version, unittest.equals('foo'));
     checkVmParams(o.vmParams);
   }
   buildCounterTemplate--;
 }
 
-buildUnnamed1257() {
+buildUnnamed1164() {
   var o = new core.List<api.ExistingDisk>();
   o.add(buildExistingDisk());
   o.add(buildExistingDisk());
   return o;
 }
 
-checkUnnamed1257(core.List<api.ExistingDisk> o) {
+checkUnnamed1164(core.List<api.ExistingDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExistingDisk(o[0]);
   checkExistingDisk(o[1]);
 }
 
-buildUnnamed1258() {
+buildUnnamed1165() {
   var o = new core.List<api.NewDisk>();
   o.add(buildNewDisk());
   o.add(buildNewDisk());
   return o;
 }
 
-checkUnnamed1258(core.List<api.NewDisk> o) {
+checkUnnamed1165(core.List<api.NewDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNewDisk(o[0]);
   checkNewDisk(o[1]);
 }
 
-buildUnnamed1259() {
+buildUnnamed1166() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed1259(core.List<api.NetworkInterface> o) {
+checkUnnamed1166(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed1260() {
+buildUnnamed1167() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed1260(core.List<api.ServiceAccount> o) {
+checkUnnamed1167(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -782,13 +782,13 @@
     o.baseInstanceName = "foo";
     o.canIpForward = true;
     o.description = "foo";
-    o.disksToAttach = buildUnnamed1257();
-    o.disksToCreate = buildUnnamed1258();
+    o.disksToAttach = buildUnnamed1164();
+    o.disksToCreate = buildUnnamed1165();
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed1259();
+    o.networkInterfaces = buildUnnamed1166();
     o.onHostMaintenance = "foo";
-    o.serviceAccounts = buildUnnamed1260();
+    o.serviceAccounts = buildUnnamed1167();
     o.tags = buildTag();
   }
   buildCounterVmParams--;
@@ -801,13 +801,13 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1257(o.disksToAttach);
-    checkUnnamed1258(o.disksToCreate);
+    checkUnnamed1164(o.disksToAttach);
+    checkUnnamed1165(o.disksToCreate);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed1259(o.networkInterfaces);
+    checkUnnamed1166(o.networkInterfaces);
     unittest.expect(o.onHostMaintenance, unittest.equals('foo'));
-    checkUnnamed1260(o.serviceAccounts);
+    checkUnnamed1167(o.serviceAccounts);
     checkTag(o.tags);
   }
   buildCounterVmParams--;
diff --git a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
index 3cff0a7..2726b71 100644
--- a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
@@ -37,14 +37,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1233() {
+buildUnnamed1173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1233(core.List<core.String> o) {
+checkUnnamed1173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.RegionViewsAddResourcesRequest();
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1233();
+    o.resources = buildUnnamed1173();
   }
   buildCounterRegionViewsAddResourcesRequest--;
   return o;
@@ -64,7 +64,7 @@
 checkRegionViewsAddResourcesRequest(api.RegionViewsAddResourcesRequest o) {
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    checkUnnamed1233(o.resources);
+    checkUnnamed1173(o.resources);
   }
   buildCounterRegionViewsAddResourcesRequest--;
 }
@@ -88,14 +88,14 @@
   buildCounterRegionViewsInsertResponse--;
 }
 
-buildUnnamed1234() {
+buildUnnamed1174() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1234(core.List<core.String> o) {
+checkUnnamed1174(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -106,7 +106,7 @@
   var o = new api.RegionViewsListResourcesResponse();
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1234();
+    o.members = buildUnnamed1174();
     o.nextPageToken = "foo";
   }
   buildCounterRegionViewsListResourcesResponse--;
@@ -116,20 +116,20 @@
 checkRegionViewsListResourcesResponse(api.RegionViewsListResourcesResponse o) {
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    checkUnnamed1234(o.members);
+    checkUnnamed1174(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRegionViewsListResourcesResponse--;
 }
 
-buildUnnamed1235() {
+buildUnnamed1175() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1235(core.List<api.ResourceView> o) {
+checkUnnamed1175(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -141,7 +141,7 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1235();
+    o.resourceViews = buildUnnamed1175();
   }
   buildCounterRegionViewsListResponse--;
   return o;
@@ -151,19 +151,19 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1235(o.resourceViews);
+    checkUnnamed1175(o.resourceViews);
   }
   buildCounterRegionViewsListResponse--;
 }
 
-buildUnnamed1236() {
+buildUnnamed1176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1236(core.List<core.String> o) {
+checkUnnamed1176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -174,7 +174,7 @@
   var o = new api.RegionViewsRemoveResourcesRequest();
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1236();
+    o.resources = buildUnnamed1176();
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
   return o;
@@ -183,32 +183,32 @@
 checkRegionViewsRemoveResourcesRequest(api.RegionViewsRemoveResourcesRequest o) {
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1236(o.resources);
+    checkUnnamed1176(o.resources);
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
 }
 
-buildUnnamed1237() {
+buildUnnamed1177() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1237(core.List<api.Label> o) {
+checkUnnamed1177(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1238() {
+buildUnnamed1178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1238(core.List<core.String> o) {
+checkUnnamed1178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -223,9 +223,9 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed1237();
+    o.labels = buildUnnamed1177();
     o.lastModified = "foo";
-    o.members = buildUnnamed1238();
+    o.members = buildUnnamed1178();
     o.name = "foo";
     o.numMembers = 42;
     o.selfLink = "foo";
@@ -241,9 +241,9 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1237(o.labels);
+    checkUnnamed1177(o.labels);
     unittest.expect(o.lastModified, unittest.equals('foo'));
-    checkUnnamed1238(o.members);
+    checkUnnamed1178(o.members);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numMembers, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -251,14 +251,14 @@
   buildCounterResourceView--;
 }
 
-buildUnnamed1239() {
+buildUnnamed1179() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1239(core.List<core.String> o) {
+checkUnnamed1179(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -269,7 +269,7 @@
   var o = new api.ZoneViewsAddResourcesRequest();
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1239();
+    o.resources = buildUnnamed1179();
   }
   buildCounterZoneViewsAddResourcesRequest--;
   return o;
@@ -278,7 +278,7 @@
 checkZoneViewsAddResourcesRequest(api.ZoneViewsAddResourcesRequest o) {
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    checkUnnamed1239(o.resources);
+    checkUnnamed1179(o.resources);
   }
   buildCounterZoneViewsAddResourcesRequest--;
 }
@@ -302,14 +302,14 @@
   buildCounterZoneViewsInsertResponse--;
 }
 
-buildUnnamed1240() {
+buildUnnamed1180() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1240(core.List<core.String> o) {
+checkUnnamed1180(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -320,7 +320,7 @@
   var o = new api.ZoneViewsListResourcesResponse();
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1240();
+    o.members = buildUnnamed1180();
     o.nextPageToken = "foo";
   }
   buildCounterZoneViewsListResourcesResponse--;
@@ -330,20 +330,20 @@
 checkZoneViewsListResourcesResponse(api.ZoneViewsListResourcesResponse o) {
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    checkUnnamed1240(o.members);
+    checkUnnamed1180(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterZoneViewsListResourcesResponse--;
 }
 
-buildUnnamed1241() {
+buildUnnamed1181() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1241(core.List<api.ResourceView> o) {
+checkUnnamed1181(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -355,7 +355,7 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1241();
+    o.resourceViews = buildUnnamed1181();
   }
   buildCounterZoneViewsListResponse--;
   return o;
@@ -365,19 +365,19 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1241(o.resourceViews);
+    checkUnnamed1181(o.resourceViews);
   }
   buildCounterZoneViewsListResponse--;
 }
 
-buildUnnamed1242() {
+buildUnnamed1182() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1242(core.List<core.String> o) {
+checkUnnamed1182(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -388,7 +388,7 @@
   var o = new api.ZoneViewsRemoveResourcesRequest();
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1242();
+    o.resources = buildUnnamed1182();
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
   return o;
@@ -397,7 +397,7 @@
 checkZoneViewsRemoveResourcesRequest(api.ZoneViewsRemoveResourcesRequest o) {
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1242(o.resources);
+    checkUnnamed1182(o.resources);
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
 }
diff --git a/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart b/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
index 1dafb56..c028e94 100644
--- a/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/resourceviews/v1beta2_test.dart
@@ -37,30 +37,30 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1287() {
+buildUnnamed1135() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1287(core.List<core.int> o) {
+checkUnnamed1135(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1288() {
+buildUnnamed1136() {
   var o = new core.Map<core.String, core.List<core.int>>();
-  o["x"] = buildUnnamed1287();
-  o["y"] = buildUnnamed1287();
+  o["x"] = buildUnnamed1135();
+  o["y"] = buildUnnamed1135();
   return o;
 }
 
-checkUnnamed1288(core.Map<core.String, core.List<core.int>> o) {
+checkUnnamed1136(core.Map<core.String, core.List<core.int>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1287(o["x"]);
-  checkUnnamed1287(o["y"]);
+  checkUnnamed1135(o["x"]);
+  checkUnnamed1135(o["y"]);
 }
 
 core.int buildCounterListResourceResponseItem = 0;
@@ -68,7 +68,7 @@
   var o = new api.ListResourceResponseItem();
   buildCounterListResourceResponseItem++;
   if (buildCounterListResourceResponseItem < 3) {
-    o.endpoints = buildUnnamed1288();
+    o.endpoints = buildUnnamed1136();
     o.resource = "foo";
   }
   buildCounterListResourceResponseItem--;
@@ -78,7 +78,7 @@
 checkListResourceResponseItem(api.ListResourceResponseItem o) {
   buildCounterListResourceResponseItem++;
   if (buildCounterListResourceResponseItem < 3) {
-    checkUnnamed1288(o.endpoints);
+    checkUnnamed1136(o.endpoints);
     unittest.expect(o.resource, unittest.equals('foo'));
   }
   buildCounterListResourceResponseItem--;
@@ -107,14 +107,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1289() {
+buildUnnamed1137() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1289(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1137(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -125,7 +125,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1289();
+    o.errors = buildUnnamed1137();
   }
   buildCounterOperationError--;
   return o;
@@ -134,7 +134,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1289(o.errors);
+    checkUnnamed1137(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -160,14 +160,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1290() {
+buildUnnamed1138() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1290(core.List<api.OperationWarningsData> o) {
+checkUnnamed1138(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -179,7 +179,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1290();
+    o.data = buildUnnamed1138();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -190,20 +190,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1290(o.data);
+    checkUnnamed1138(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1291() {
+buildUnnamed1139() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1291(core.List<api.OperationWarnings> o) {
+checkUnnamed1139(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -234,7 +234,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1291();
+    o.warnings = buildUnnamed1139();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -264,20 +264,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1291(o.warnings);
+    checkUnnamed1139(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1292() {
+buildUnnamed1140() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1292(core.List<api.Operation> o) {
+checkUnnamed1140(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -289,7 +289,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1292();
+    o.items = buildUnnamed1140();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -302,7 +302,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1292(o.items);
+    checkUnnamed1140(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -310,40 +310,40 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed1293() {
+buildUnnamed1141() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1293(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1141(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
 }
 
-buildUnnamed1294() {
+buildUnnamed1142() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1294(core.List<api.Label> o) {
+checkUnnamed1142(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1295() {
+buildUnnamed1143() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1295(core.List<core.String> o) {
+checkUnnamed1143(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -356,14 +356,14 @@
   if (buildCounterResourceView < 3) {
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.endpoints = buildUnnamed1293();
+    o.endpoints = buildUnnamed1141();
     o.fingerprint = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed1294();
+    o.labels = buildUnnamed1142();
     o.name = "foo";
     o.network = "foo";
-    o.resources = buildUnnamed1295();
+    o.resources = buildUnnamed1143();
     o.selfLink = "foo";
     o.size = 42;
   }
@@ -376,14 +376,14 @@
   if (buildCounterResourceView < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1293(o.endpoints);
+    checkUnnamed1141(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1294(o.labels);
+    checkUnnamed1142(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed1295(o.resources);
+    checkUnnamed1143(o.resources);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.size, unittest.equals(42));
   }
@@ -411,14 +411,14 @@
   buildCounterServiceEndpoint--;
 }
 
-buildUnnamed1296() {
+buildUnnamed1144() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1296(core.List<core.String> o) {
+checkUnnamed1144(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -429,7 +429,7 @@
   var o = new api.ZoneViewsAddResourcesRequest();
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1296();
+    o.resources = buildUnnamed1144();
   }
   buildCounterZoneViewsAddResourcesRequest--;
   return o;
@@ -438,19 +438,19 @@
 checkZoneViewsAddResourcesRequest(api.ZoneViewsAddResourcesRequest o) {
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    checkUnnamed1296(o.resources);
+    checkUnnamed1144(o.resources);
   }
   buildCounterZoneViewsAddResourcesRequest--;
 }
 
-buildUnnamed1297() {
+buildUnnamed1145() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1297(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1145(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
@@ -461,7 +461,7 @@
   var o = new api.ZoneViewsGetServiceResponse();
   buildCounterZoneViewsGetServiceResponse++;
   if (buildCounterZoneViewsGetServiceResponse < 3) {
-    o.endpoints = buildUnnamed1297();
+    o.endpoints = buildUnnamed1145();
     o.fingerprint = "foo";
   }
   buildCounterZoneViewsGetServiceResponse--;
@@ -471,20 +471,20 @@
 checkZoneViewsGetServiceResponse(api.ZoneViewsGetServiceResponse o) {
   buildCounterZoneViewsGetServiceResponse++;
   if (buildCounterZoneViewsGetServiceResponse < 3) {
-    checkUnnamed1297(o.endpoints);
+    checkUnnamed1145(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
   }
   buildCounterZoneViewsGetServiceResponse--;
 }
 
-buildUnnamed1298() {
+buildUnnamed1146() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1298(core.List<api.ResourceView> o) {
+checkUnnamed1146(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -495,7 +495,7 @@
   var o = new api.ZoneViewsList();
   buildCounterZoneViewsList++;
   if (buildCounterZoneViewsList < 3) {
-    o.items = buildUnnamed1298();
+    o.items = buildUnnamed1146();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -507,7 +507,7 @@
 checkZoneViewsList(api.ZoneViewsList o) {
   buildCounterZoneViewsList++;
   if (buildCounterZoneViewsList < 3) {
-    checkUnnamed1298(o.items);
+    checkUnnamed1146(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -515,14 +515,14 @@
   buildCounterZoneViewsList--;
 }
 
-buildUnnamed1299() {
+buildUnnamed1147() {
   var o = new core.List<api.ListResourceResponseItem>();
   o.add(buildListResourceResponseItem());
   o.add(buildListResourceResponseItem());
   return o;
 }
 
-checkUnnamed1299(core.List<api.ListResourceResponseItem> o) {
+checkUnnamed1147(core.List<api.ListResourceResponseItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListResourceResponseItem(o[0]);
   checkListResourceResponseItem(o[1]);
@@ -533,7 +533,7 @@
   var o = new api.ZoneViewsListResourcesResponse();
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    o.items = buildUnnamed1299();
+    o.items = buildUnnamed1147();
     o.network = "foo";
     o.nextPageToken = "foo";
   }
@@ -544,21 +544,21 @@
 checkZoneViewsListResourcesResponse(api.ZoneViewsListResourcesResponse o) {
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    checkUnnamed1299(o.items);
+    checkUnnamed1147(o.items);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterZoneViewsListResourcesResponse--;
 }
 
-buildUnnamed1300() {
+buildUnnamed1148() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1300(core.List<core.String> o) {
+checkUnnamed1148(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -569,7 +569,7 @@
   var o = new api.ZoneViewsRemoveResourcesRequest();
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1300();
+    o.resources = buildUnnamed1148();
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
   return o;
@@ -578,19 +578,19 @@
 checkZoneViewsRemoveResourcesRequest(api.ZoneViewsRemoveResourcesRequest o) {
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1300(o.resources);
+    checkUnnamed1148(o.resources);
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
 }
 
-buildUnnamed1301() {
+buildUnnamed1149() {
   var o = new core.List<api.ServiceEndpoint>();
   o.add(buildServiceEndpoint());
   o.add(buildServiceEndpoint());
   return o;
 }
 
-checkUnnamed1301(core.List<api.ServiceEndpoint> o) {
+checkUnnamed1149(core.List<api.ServiceEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceEndpoint(o[0]);
   checkServiceEndpoint(o[1]);
@@ -601,7 +601,7 @@
   var o = new api.ZoneViewsSetServiceRequest();
   buildCounterZoneViewsSetServiceRequest++;
   if (buildCounterZoneViewsSetServiceRequest < 3) {
-    o.endpoints = buildUnnamed1301();
+    o.endpoints = buildUnnamed1149();
     o.fingerprint = "foo";
     o.resourceName = "foo";
   }
@@ -612,7 +612,7 @@
 checkZoneViewsSetServiceRequest(api.ZoneViewsSetServiceRequest o) {
   buildCounterZoneViewsSetServiceRequest++;
   if (buildCounterZoneViewsSetServiceRequest < 3) {
-    checkUnnamed1301(o.endpoints);
+    checkUnnamed1149(o.endpoints);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
   }
diff --git a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
index 489518f..7a90e66 100644
--- a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
+++ b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
@@ -78,14 +78,14 @@
   buildCounterBackupRun--;
 }
 
-buildUnnamed1261() {
+buildUnnamed1109() {
   var o = new core.List<api.BackupRun>();
   o.add(buildBackupRun());
   o.add(buildBackupRun());
   return o;
 }
 
-checkUnnamed1261(core.List<api.BackupRun> o) {
+checkUnnamed1109(core.List<api.BackupRun> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupRun(o[0]);
   checkBackupRun(o[1]);
@@ -96,7 +96,7 @@
   var o = new api.BackupRunsListResponse();
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    o.items = buildUnnamed1261();
+    o.items = buildUnnamed1109();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -107,7 +107,7 @@
 checkBackupRunsListResponse(api.BackupRunsListResponse o) {
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    checkUnnamed1261(o.items);
+    checkUnnamed1109(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -183,27 +183,27 @@
   buildCounterDatabaseFlags--;
 }
 
-buildUnnamed1262() {
+buildUnnamed1110() {
   var o = new core.List<api.IpMapping>();
   o.add(buildIpMapping());
   o.add(buildIpMapping());
   return o;
 }
 
-checkUnnamed1262(core.List<api.IpMapping> o) {
+checkUnnamed1110(core.List<api.IpMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIpMapping(o[0]);
   checkIpMapping(o[1]);
 }
 
-buildUnnamed1263() {
+buildUnnamed1111() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1263(core.List<core.String> o) {
+checkUnnamed1111(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -219,13 +219,13 @@
     o.etag = "foo";
     o.instance = "foo";
     o.instanceType = "foo";
-    o.ipAddresses = buildUnnamed1262();
+    o.ipAddresses = buildUnnamed1110();
     o.kind = "foo";
     o.masterInstanceName = "foo";
     o.maxDiskSize = "foo";
     o.project = "foo";
     o.region = "foo";
-    o.replicaNames = buildUnnamed1263();
+    o.replicaNames = buildUnnamed1111();
     o.serverCaCert = buildSslCert();
     o.settings = buildSettings();
     o.state = "foo";
@@ -242,13 +242,13 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.instance, unittest.equals('foo'));
     unittest.expect(o.instanceType, unittest.equals('foo'));
-    checkUnnamed1262(o.ipAddresses);
+    checkUnnamed1110(o.ipAddresses);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.masterInstanceName, unittest.equals('foo'));
     unittest.expect(o.maxDiskSize, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed1263(o.replicaNames);
+    checkUnnamed1111(o.replicaNames);
     checkSslCert(o.serverCaCert);
     checkSettings(o.settings);
     unittest.expect(o.state, unittest.equals('foo'));
@@ -256,27 +256,27 @@
   buildCounterDatabaseInstance--;
 }
 
-buildUnnamed1264() {
+buildUnnamed1112() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1264(core.List<core.String> o) {
+checkUnnamed1112(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1265() {
+buildUnnamed1113() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1265(core.List<core.String> o) {
+checkUnnamed1113(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -287,9 +287,9 @@
   var o = new api.ExportContext();
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    o.database = buildUnnamed1264();
+    o.database = buildUnnamed1112();
     o.kind = "foo";
-    o.table = buildUnnamed1265();
+    o.table = buildUnnamed1113();
     o.uri = "foo";
   }
   buildCounterExportContext--;
@@ -299,35 +299,35 @@
 checkExportContext(api.ExportContext o) {
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    checkUnnamed1264(o.database);
+    checkUnnamed1112(o.database);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1265(o.table);
+    checkUnnamed1113(o.table);
     unittest.expect(o.uri, unittest.equals('foo'));
   }
   buildCounterExportContext--;
 }
 
-buildUnnamed1266() {
+buildUnnamed1114() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1266(core.List<core.String> o) {
+checkUnnamed1114(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1267() {
+buildUnnamed1115() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1267(core.List<core.String> o) {
+checkUnnamed1115(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -338,8 +338,8 @@
   var o = new api.Flag();
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    o.allowedStringValues = buildUnnamed1266();
-    o.appliesTo = buildUnnamed1267();
+    o.allowedStringValues = buildUnnamed1114();
+    o.appliesTo = buildUnnamed1115();
     o.kind = "foo";
     o.maxValue = "foo";
     o.minValue = "foo";
@@ -353,8 +353,8 @@
 checkFlag(api.Flag o) {
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    checkUnnamed1266(o.allowedStringValues);
-    checkUnnamed1267(o.appliesTo);
+    checkUnnamed1114(o.allowedStringValues);
+    checkUnnamed1115(o.appliesTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maxValue, unittest.equals('foo'));
     unittest.expect(o.minValue, unittest.equals('foo'));
@@ -364,14 +364,14 @@
   buildCounterFlag--;
 }
 
-buildUnnamed1268() {
+buildUnnamed1116() {
   var o = new core.List<api.Flag>();
   o.add(buildFlag());
   o.add(buildFlag());
   return o;
 }
 
-checkUnnamed1268(core.List<api.Flag> o) {
+checkUnnamed1116(core.List<api.Flag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFlag(o[0]);
   checkFlag(o[1]);
@@ -382,7 +382,7 @@
   var o = new api.FlagsListResponse();
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    o.items = buildUnnamed1268();
+    o.items = buildUnnamed1116();
     o.kind = "foo";
   }
   buildCounterFlagsListResponse--;
@@ -392,20 +392,20 @@
 checkFlagsListResponse(api.FlagsListResponse o) {
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    checkUnnamed1268(o.items);
+    checkUnnamed1116(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterFlagsListResponse--;
 }
 
-buildUnnamed1269() {
+buildUnnamed1117() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1269(core.List<core.String> o) {
+checkUnnamed1117(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -418,7 +418,7 @@
   if (buildCounterImportContext < 3) {
     o.database = "foo";
     o.kind = "foo";
-    o.uri = buildUnnamed1269();
+    o.uri = buildUnnamed1117();
   }
   buildCounterImportContext--;
   return o;
@@ -429,19 +429,19 @@
   if (buildCounterImportContext < 3) {
     unittest.expect(o.database, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1269(o.uri);
+    checkUnnamed1117(o.uri);
   }
   buildCounterImportContext--;
 }
 
-buildUnnamed1270() {
+buildUnnamed1118() {
   var o = new core.List<api.OperationError>();
   o.add(buildOperationError());
   o.add(buildOperationError());
   return o;
 }
 
-checkUnnamed1270(core.List<api.OperationError> o) {
+checkUnnamed1118(core.List<api.OperationError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationError(o[0]);
   checkOperationError(o[1]);
@@ -454,7 +454,7 @@
   if (buildCounterInstanceOperation < 3) {
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.enqueuedTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.error = buildUnnamed1270();
+    o.error = buildUnnamed1118();
     o.exportContext = buildExportContext();
     o.importContext = buildImportContext();
     o.instance = "foo";
@@ -474,7 +474,7 @@
   if (buildCounterInstanceOperation < 3) {
     unittest.expect(o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.enqueuedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1270(o.error);
+    checkUnnamed1118(o.error);
     checkExportContext(o.exportContext);
     checkImportContext(o.importContext);
     unittest.expect(o.instance, unittest.equals('foo'));
@@ -669,14 +669,14 @@
   buildCounterInstancesInsertResponse--;
 }
 
-buildUnnamed1271() {
+buildUnnamed1119() {
   var o = new core.List<api.DatabaseInstance>();
   o.add(buildDatabaseInstance());
   o.add(buildDatabaseInstance());
   return o;
 }
 
-checkUnnamed1271(core.List<api.DatabaseInstance> o) {
+checkUnnamed1119(core.List<api.DatabaseInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseInstance(o[0]);
   checkDatabaseInstance(o[1]);
@@ -687,7 +687,7 @@
   var o = new api.InstancesListResponse();
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    o.items = buildUnnamed1271();
+    o.items = buildUnnamed1119();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -698,7 +698,7 @@
 checkInstancesListResponse(api.InstancesListResponse o) {
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    checkUnnamed1271(o.items);
+    checkUnnamed1119(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -831,14 +831,14 @@
   buildCounterInstancesUpdateResponse--;
 }
 
-buildUnnamed1272() {
+buildUnnamed1120() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1272(core.List<core.String> o) {
+checkUnnamed1120(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -849,7 +849,7 @@
   var o = new api.IpConfiguration();
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    o.authorizedNetworks = buildUnnamed1272();
+    o.authorizedNetworks = buildUnnamed1120();
     o.enabled = true;
     o.requireSsl = true;
   }
@@ -860,7 +860,7 @@
 checkIpConfiguration(api.IpConfiguration o) {
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    checkUnnamed1272(o.authorizedNetworks);
+    checkUnnamed1120(o.authorizedNetworks);
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.requireSsl, unittest.isTrue);
   }
@@ -932,14 +932,14 @@
   buildCounterOperationError--;
 }
 
-buildUnnamed1273() {
+buildUnnamed1121() {
   var o = new core.List<api.InstanceOperation>();
   o.add(buildInstanceOperation());
   o.add(buildInstanceOperation());
   return o;
 }
 
-checkUnnamed1273(core.List<api.InstanceOperation> o) {
+checkUnnamed1121(core.List<api.InstanceOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceOperation(o[0]);
   checkInstanceOperation(o[1]);
@@ -950,7 +950,7 @@
   var o = new api.OperationsListResponse();
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    o.items = buildUnnamed1273();
+    o.items = buildUnnamed1121();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -961,7 +961,7 @@
 checkOperationsListResponse(api.OperationsListResponse o) {
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    checkUnnamed1273(o.items);
+    checkUnnamed1121(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -989,40 +989,40 @@
   buildCounterSetRootPasswordContext--;
 }
 
-buildUnnamed1274() {
+buildUnnamed1122() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1274(core.List<core.String> o) {
+checkUnnamed1122(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1275() {
+buildUnnamed1123() {
   var o = new core.List<api.BackupConfiguration>();
   o.add(buildBackupConfiguration());
   o.add(buildBackupConfiguration());
   return o;
 }
 
-checkUnnamed1275(core.List<api.BackupConfiguration> o) {
+checkUnnamed1123(core.List<api.BackupConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupConfiguration(o[0]);
   checkBackupConfiguration(o[1]);
 }
 
-buildUnnamed1276() {
+buildUnnamed1124() {
   var o = new core.List<api.DatabaseFlags>();
   o.add(buildDatabaseFlags());
   o.add(buildDatabaseFlags());
   return o;
 }
 
-checkUnnamed1276(core.List<api.DatabaseFlags> o) {
+checkUnnamed1124(core.List<api.DatabaseFlags> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseFlags(o[0]);
   checkDatabaseFlags(o[1]);
@@ -1034,9 +1034,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.activationPolicy = "foo";
-    o.authorizedGaeApplications = buildUnnamed1274();
-    o.backupConfiguration = buildUnnamed1275();
-    o.databaseFlags = buildUnnamed1276();
+    o.authorizedGaeApplications = buildUnnamed1122();
+    o.backupConfiguration = buildUnnamed1123();
+    o.databaseFlags = buildUnnamed1124();
     o.databaseReplicationEnabled = true;
     o.ipConfiguration = buildIpConfiguration();
     o.kind = "foo";
@@ -1054,9 +1054,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.activationPolicy, unittest.equals('foo'));
-    checkUnnamed1274(o.authorizedGaeApplications);
-    checkUnnamed1275(o.backupConfiguration);
-    checkUnnamed1276(o.databaseFlags);
+    checkUnnamed1122(o.authorizedGaeApplications);
+    checkUnnamed1123(o.backupConfiguration);
+    checkUnnamed1124(o.databaseFlags);
     unittest.expect(o.databaseReplicationEnabled, unittest.isTrue);
     checkIpConfiguration(o.ipConfiguration);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1186,14 +1186,14 @@
   buildCounterSslCertsInsertResponse--;
 }
 
-buildUnnamed1277() {
+buildUnnamed1125() {
   var o = new core.List<api.SslCert>();
   o.add(buildSslCert());
   o.add(buildSslCert());
   return o;
 }
 
-checkUnnamed1277(core.List<api.SslCert> o) {
+checkUnnamed1125(core.List<api.SslCert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSslCert(o[0]);
   checkSslCert(o[1]);
@@ -1204,7 +1204,7 @@
   var o = new api.SslCertsListResponse();
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    o.items = buildUnnamed1277();
+    o.items = buildUnnamed1125();
     o.kind = "foo";
   }
   buildCounterSslCertsListResponse--;
@@ -1214,20 +1214,20 @@
 checkSslCertsListResponse(api.SslCertsListResponse o) {
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    checkUnnamed1277(o.items);
+    checkUnnamed1125(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSslCertsListResponse--;
 }
 
-buildUnnamed1278() {
+buildUnnamed1126() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1278(core.List<core.String> o) {
+checkUnnamed1126(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1241,7 +1241,7 @@
     o.DiskQuota = "foo";
     o.RAM = "foo";
     o.kind = "foo";
-    o.region = buildUnnamed1278();
+    o.region = buildUnnamed1126();
     o.tier = "foo";
   }
   buildCounterTier--;
@@ -1254,20 +1254,20 @@
     unittest.expect(o.DiskQuota, unittest.equals('foo'));
     unittest.expect(o.RAM, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1278(o.region);
+    checkUnnamed1126(o.region);
     unittest.expect(o.tier, unittest.equals('foo'));
   }
   buildCounterTier--;
 }
 
-buildUnnamed1279() {
+buildUnnamed1127() {
   var o = new core.List<api.Tier>();
   o.add(buildTier());
   o.add(buildTier());
   return o;
 }
 
-checkUnnamed1279(core.List<api.Tier> o) {
+checkUnnamed1127(core.List<api.Tier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTier(o[0]);
   checkTier(o[1]);
@@ -1278,7 +1278,7 @@
   var o = new api.TiersListResponse();
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    o.items = buildUnnamed1279();
+    o.items = buildUnnamed1127();
     o.kind = "foo";
   }
   buildCounterTiersListResponse--;
@@ -1288,7 +1288,7 @@
 checkTiersListResponse(api.TiersListResponse o) {
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    checkUnnamed1279(o.items);
+    checkUnnamed1127(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTiersListResponse--;
diff --git a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
index 6e86038..3061855 100644
--- a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
@@ -49,40 +49,40 @@
   buildCounterTask--;
 }
 
-buildUnnamed1145() {
+buildUnnamed1168() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1145(core.List<core.String> o) {
+checkUnnamed1168(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1146() {
+buildUnnamed1169() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1146(core.List<core.String> o) {
+checkUnnamed1169(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1147() {
+buildUnnamed1170() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1147(core.List<core.String> o) {
+checkUnnamed1170(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -93,9 +93,9 @@
   var o = new api.TaskQueueAcl();
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    o.adminEmails = buildUnnamed1145();
-    o.consumerEmails = buildUnnamed1146();
-    o.producerEmails = buildUnnamed1147();
+    o.adminEmails = buildUnnamed1168();
+    o.consumerEmails = buildUnnamed1169();
+    o.producerEmails = buildUnnamed1170();
   }
   buildCounterTaskQueueAcl--;
   return o;
@@ -104,9 +104,9 @@
 checkTaskQueueAcl(api.TaskQueueAcl o) {
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    checkUnnamed1145(o.adminEmails);
-    checkUnnamed1146(o.consumerEmails);
-    checkUnnamed1147(o.producerEmails);
+    checkUnnamed1168(o.adminEmails);
+    checkUnnamed1169(o.consumerEmails);
+    checkUnnamed1170(o.producerEmails);
   }
   buildCounterTaskQueueAcl--;
 }
@@ -163,14 +163,14 @@
   buildCounterTaskQueue--;
 }
 
-buildUnnamed1148() {
+buildUnnamed1171() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1148(core.List<api.Task> o) {
+checkUnnamed1171(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -181,7 +181,7 @@
   var o = new api.Tasks();
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    o.items = buildUnnamed1148();
+    o.items = buildUnnamed1171();
     o.kind = "foo";
   }
   buildCounterTasks--;
@@ -191,20 +191,20 @@
 checkTasks(api.Tasks o) {
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    checkUnnamed1148(o.items);
+    checkUnnamed1171(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks--;
 }
 
-buildUnnamed1149() {
+buildUnnamed1172() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1149(core.List<api.Task> o) {
+checkUnnamed1172(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.Tasks2();
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    o.items = buildUnnamed1149();
+    o.items = buildUnnamed1172();
     o.kind = "foo";
   }
   buildCounterTasks2--;
@@ -225,7 +225,7 @@
 checkTasks2(api.Tasks2 o) {
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    checkUnnamed1149(o.items);
+    checkUnnamed1172(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks2--;
diff --git a/resources/googleapis/CHANGELOG.md b/resources/googleapis/CHANGELOG.md
index 5837942..5aea4eb 100644
--- a/resources/googleapis/CHANGELOG.md
+++ b/resources/googleapis/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.3.1
+
+* [apis] admin_directory:v1: additional schema/methods
+* [apis] analytics:v3: additional schemas/methods
+* [apis] gmail:v1: additional schemas/methods
+* [apis] reseller:v1: additional schemas/methods
+
 ## 0.3.0
 
 * [apis-removed] orkut:v2: removed (Orkut is shut down)
diff --git a/resources/googleapis_beta/CHANGELOG.md b/resources/googleapis_beta/CHANGELOG.md
index 570cbbe..7e49e42 100644
--- a/resources/googleapis_beta/CHANGELOG.md
+++ b/resources/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.4.0
+
+* [apis] cloudmonitoring:v2beta1: additional schemas/methods
+* [apis-breaking] genomics:v1beta: additional schemas/methods, minor removal of schema properties
+
 ## 0.3.0
 
 * [apis-breaking] genomics:v1beta: breaking changes (method argument changes and schema change)
